50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
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)
|