Mi2dRPGamEng/tests/test_noise.py

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)