# -*- coding: utf-8 -*-
"""
PyFastNoiseSIMD unit testing
@author: Robert A. McLeod
"""
import pyfastnoisesimd as fns
import numpy as np
import numpy.testing as npt
import os, os.path, sys
import tempfile
import unittest
from logging import Logger
log = Logger(__name__)
# X is block size.
# For AVX512, if we want to have 4 workers we should have at least 16 x 4
# blocks.
CHUNK = fns.helpers._MIN_CHUNK_SIZE
CHUNK2 = int(np.sqrt(CHUNK)) + 4
CHUNK3 = int(np.cbrt(CHUNK)) + 2
class FNS_Tests(unittest.TestCase):
def setUp(self):
pass
def grid_3d(self, size=CHUNK3, numWorkers=1):
noise = fns.Noise(seed=None, numWorkers=numWorkers)
noise.frequency = 0.15
assert(noise.frequency == 0.15)
noise.axesScales = [0.9, 0.85, 0.9]
assert(noise.axesScales == [0.9, 0.85, 0.9])
result = noise.genAsGrid(shape=[size,size,size])
assert(result.shape == (size,size,size))
def grid_2d(self, size=CHUNK2, numWorkers=1):
noise = fns.Noise(seed=None, numWorkers=numWorkers)
# Test 2D
result = noise.genAsGrid(shape=[size,size])
assert(result.shape == (size,size))
def grid_1d(self, size=CHUNK, numWorkers=1):
# Test 1D
noise = fns.Noise(seed=None, numWorkers=numWorkers)
result = noise.genAsGrid(shape=size)
assert(result.shape == (size,))
def coords(self, size=CHUNK, numWorkers=1):
noise = fns.Noise(seed=None, numWorkers=numWorkers)
coords = fns.empty_coords(size)
coords[0,:] = np.arange(size)
coords[1,:] = np.arange(-size//2, size//2)
coords[2,:] = np.linspace(-1.0, 1.0, size)
noise.genFromCoords(coords)
# Re-use coords to make sure the array isn't accidentally free'd
# in FastNoiseSIMD
noise2 = fns.Noise(seed=None, numWorkers=numWorkers)
noise2.genFromCoords(coords)
return
def test_grid_1thread(self):
self.grid_3d(size=CHUNK3, numWorkers=1)
self.grid_2d(size=CHUNK2, numWorkers=1)
self.grid_1d(size=CHUNK, numWorkers=1)
def test_grid_4thread(self):
self.grid_3d(size=CHUNK3, numWorkers=4)
self.grid_2d(size=CHUNK2, numWorkers=4)
self.grid_1d(size=CHUNK, numWorkers=4)
def test_coords_1(self):
self.coords(size=CHUNK, numWorkers=1)
def test_coords_4(self):
self.coords(size=CHUNK, numWorkers=1)
def test_noise_type(self, size=CHUNK, numWorkers=1):
noise = fns.Noise(seed=None, numWorkers=numWorkers)
# Iterate through NoiseType
for newNoise in fns.NoiseType:
noise.noiseType = newNoise
assert(noise.noiseType == newNoise)
result = noise.genAsGrid(shape=size)
def fractal(self, size=CHUNK, numWorkers=1):
# Iterate through FractalType
noise = fns.Noise(seed=None, numWorkers=numWorkers)
noise.fractal.octaves = 2
assert(noise.fractal.octaves == 2)
noise.fractal.lacunarity = 1.9
assert(noise.fractal.lacunarity == 1.9)
noise.fractal.gain = 0.7
assert(noise.fractal.gain == 0.7)
for newFractal in fns.FractalType:
noise.fractal.fractalType = newFractal
assert(noise.fractal.fractalType == newFractal)
noise.genAsGrid(shape=size)
def test_perturb(self, size=CHUNK, numWorkers=1):
# Iterate through PeturbType
noise = fns.Noise(seed=None, numWorkers=numWorkers)
noise.perturb.amp = 1.1
assert(noise.perturb.amp == 1.1)
noise.perturb.frequency = 0.44
assert(noise.perturb.frequency == 0.44)
noise.perturb.octaves = 2
assert(noise.perturb.octaves == 2)
noise.perturb.lacunarity = 2.2
assert(noise.perturb.lacunarity == 2.2)
noise.perturb.gain = 0.6
assert(noise.perturb.gain == 0.6)
for newPeturb in fns.PerturbType:
noise.perturb.perturbType = newPeturb
assert(noise.perturb.perturbType == newPeturb)
noise.genAsGrid(shape=size)
def test_cell(self, size=CHUNK, numWorkers=1):
noise = fns.Noise(seed=None, numWorkers=numWorkers)
# Iterate through cellular options
noise.cell.jitter = 0.7
assert(noise.cell.jitter == 0.7)
noise.cell.lookupFrequency = 0.3
assert(noise.cell.lookupFrequency == 0.3)
noise.cell.distanceIndices = [0, 2]
assert(noise.cell.distanceIndices == [0, 2])
noise.cell.returnType = fns.CellularReturnType.NoiseLookup
for newNoise in fns.NoiseType:
noise.cell.noiseLookupType = newNoise
assert(noise.cell.noiseLookupType == newNoise)
noise.genAsGrid(shape=size)
for retType in fns.CellularReturnType:
noise.cell.returnType = retType
assert(noise.cell.returnType == retType)
noise.genAsGrid(shape=size)
for distFunc in fns.CellularDistanceFunction:
noise.cell.distanceFunc = distFunc
assert(noise.cell.distanceFunc == distFunc)
noise.genAsGrid(shape=size)
[docs]def test(verbosity=2):
'''
test(verbosity=2)
Run ``unittest`` suite for ``pyfastnoisesimd`` package.
'''
log.info( "pyfastnoisesimd tests for version: {}".format(fns.__version__))
theSuite = unittest.TestSuite()
theSuite.addTest(unittest.makeSuite(FNS_Tests))
return unittest.TextTestRunner(verbosity=verbosity).run(theSuite)
if __name__ == "__main__":
# For continuous integraton, call as:
# python -c \"import sys;import pyfastnoisesimd as fns;sys.exit(0 if fns.test().wasSuccessful() else 1)\""
test_result = test()
print( "Tests result: {}".format(test_result))