import numpy as np from engine.worldgen.noise import perlin_noise_2d def test_same_seed_is_deterministic(): a = perlin_noise_2d(8, 8, seed=42) b = perlin_noise_2d(8, 8, seed=42) assert np.array_equal(a, b) def test_different_seeds_produce_different_noise(): a = perlin_noise_2d(8, 8, seed=1) b = perlin_noise_2d(8, 8, seed=2) assert not np.array_equal(a, b) def test_output_shape_matches_width_and_height(): result = perlin_noise_2d(5, 9, seed=7) assert result.shape == (9, 5) def test_output_is_roughly_normalized_to_zero_one(): result = perlin_noise_2d(32, 32, seed=3, octaves=4) assert result.min() >= 0.0 assert result.max() <= 1.0 # not degenerate/constant assert result.max() - result.min() > 0.05 def test_offset_sampling_tiles_seamlessly_with_a_direct_full_field_sample(): # Sampling two adjacent 4-wide windows via x_offset must match sampling the same 8-wide # region directly in one call - this is what lets neighboring chunks share one continuous # noise field with no seam at the boundary. seed = 99 whole = perlin_noise_2d(8, 4, seed=seed) left = perlin_noise_2d(4, 4, seed=seed, x_offset=0) right = perlin_noise_2d(4, 4, seed=seed, x_offset=4) assert np.allclose(whole[:, :4], left) assert np.allclose(whole[:, 4:], right) def test_y_offset_also_tiles_seamlessly(): seed = 7 whole = perlin_noise_2d(4, 8, seed=seed) top = perlin_noise_2d(4, 4, seed=seed, y_offset=0) bottom = perlin_noise_2d(4, 4, seed=seed, y_offset=4) assert np.allclose(whole[:4, :], top) assert np.allclose(whole[4:, :], bottom)