mirror of
				https://github.com/KevinMidboe/python-gpiozero.git
				synced 2025-10-29 17:50:37 +00:00 
			
		
		
		
	Also adds extra parameter validation to the existing source tools, adds input min and max to inverted, and adds many more source tools unit tests.
		
			
				
	
	
		
			274 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			274 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from __future__ import (
 | |
|     unicode_literals,
 | |
|     absolute_import,
 | |
|     print_function,
 | |
|     division,
 | |
|     )
 | |
| str = type('')
 | |
| 
 | |
| 
 | |
| import pytest
 | |
| from math import sin, cos, radians
 | |
| from time import time
 | |
| 
 | |
| from gpiozero.tools import *
 | |
| try:
 | |
|     from math import isclose
 | |
| except ImportError:
 | |
|     from gpiozero.compat import isclose
 | |
| try:
 | |
|     from statistics import mean
 | |
| except ImportError:
 | |
|     from gpiozero.compat import mean
 | |
| try:
 | |
|     from statistics import median
 | |
| except ImportError:
 | |
|     from gpiozero.compat import median
 | |
| 
 | |
| 
 | |
| def test_negated():
 | |
|     assert list(negated(())) == []
 | |
|     assert list(negated((True, True, False, False))) == [False, False, True, True]
 | |
| 
 | |
| def test_inverted():
 | |
|     with pytest.raises(ValueError):
 | |
|         list(inverted((), 0, 0))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(inverted((), 1, 1))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(inverted((), 1, 0))
 | |
|     assert list(inverted(())) == []
 | |
|     assert list(inverted((1, 0, 0.1, 0.5))) == [0, 1, 0.9, 0.5]
 | |
|     assert list(inverted((1, 0, 0.1, 0.5), 0, 1)) == [0, 1, 0.9, 0.5]
 | |
|     assert list(inverted((-1, 0, -0.1, -0.5), -1, 0)) == [0, -1, -0.9, -0.5]
 | |
|     assert list(inverted((1, 0, 0.1, 0.5, -1, -0.1, -0.5), -1, 1)) == [-1, 0, -0.1, -0.5, 1, 0.1, 0.5]
 | |
|     assert list(inverted((2, 1, 1.1, 1.5), 1, 2)) == [1, 2, 1.9, 1.5]
 | |
| 
 | |
| def test_scaled():
 | |
|     with pytest.raises(ValueError):
 | |
|         list(scaled((), 0, 1, 0, 0))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(scaled((), 0, 1, 1, 1))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(scaled((), 0, 1, 1, 0))
 | |
|     assert list(scaled((), 0, 1)) == []
 | |
|     # no scale
 | |
|     assert list(scaled((0, 1, 0.5, 0.1), 0, 1)) == [0, 1, 0.5, 0.1]
 | |
|     assert list(scaled((0, 1, 0.5, 0.1), 0, 1, 0, 1)) == [0, 1, 0.5, 0.1]
 | |
|     # multiply by 2
 | |
|     assert list(scaled((0, 1, 0.5, 0.1), 0, 2, 0, 1)) == [0, 2, 1, 0.2]
 | |
|     # add 1
 | |
|     assert list(scaled((0, 1, 0.5, 0.1), 1, 2, 0, 1)) == [1, 2, 1.5, 1.1]
 | |
|     # multiply by 2 then add 1
 | |
|     assert list(scaled((0, 1, 0.5, 0.1), 1, 3, 0, 1)) == [1, 3, 2, 1.2]
 | |
|     # add 1 then multiply by 2
 | |
|     assert list(scaled((0, 1, 0.5, 0.1), 2, 4, 0, 1)) == [2, 4, 3, 2.2]
 | |
|     # invert
 | |
|     assert list(scaled((0, 1, 0.5, 0.1), 1, 0, 0, 1)) == [1, 0, 0.5, 0.9]
 | |
|     # multiply by -1 then subtract 1
 | |
|     assert list(scaled((0, 1, 0.5, 0.1), -1, -2, 0, 1)) == [-1, -2, -1.5, -1.1]
 | |
|     # scale 0->1 to -1->+1
 | |
|     assert list(scaled((0, 1, 0.5, 0.1), -1, 1)) == [-1, 1, 0.0, -0.8]
 | |
|     assert list(scaled((0, 1, 0.5, 0.1), -1, 1, 0, 1)) == [-1, 1, 0.0, -0.8]
 | |
|     # scale -1->+1 to 0->1
 | |
|     assert list(scaled((-1, 1, 0.0, -0.5), 0, 1, -1, 1)) == [0, 1, 0.5, 0.25]
 | |
| 
 | |
| def test_clamped():
 | |
|     with pytest.raises(ValueError):
 | |
|         list(clamped((), 0, 0))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(clamped((), 1, 1))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(clamped((), 1, 0))
 | |
|     assert list(clamped(())) == []
 | |
|     assert list(clamped((-2, -1, -0.5, 0, 0.5, 1, 2))) == [0, 0, 0, 0, 0.5, 1, 1]
 | |
|     assert list(clamped((-2, -1, -0.5, 0, 0.5, 1, 2), 0, 1)) == [0, 0, 0, 0, 0.5, 1, 1]
 | |
|     assert list(clamped((-2, -1, -0.5, 0, 0.5, 1, 2), -1, 1)) == [-1, -1, -0.5, 0, 0.5, 1, 1]
 | |
|     assert list(clamped((-2, -1, -0.5, 0, 0.5, 1, 2), -2, 2)) == [-2, -1, -0.5, 0, 0.5, 1, 2]
 | |
| 
 | |
| def test_absoluted():
 | |
|     assert list(absoluted(())) == []
 | |
|     assert list(absoluted((-2, -1, 0, 1, 2))) == [2, 1, 0, 1, 2]
 | |
| 
 | |
| def test_quantized():
 | |
|     with pytest.raises(ValueError):
 | |
|         list(quantized((), 0))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(quantized((), 4, 0, 0))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(quantized((), 4, 1, 1))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(quantized((), 4, 1, 0))
 | |
|     assert list(quantized((), 4)) == []
 | |
|     assert list(quantized((0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1), 4)) == [
 | |
|             0.0, 0.0, 0.0, 0.25, 0.25, 0.5, 0.5, 0.5, 0.75, 0.75, 1.0]
 | |
|     assert list(quantized((0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1), 4, 0, 1)) == [
 | |
|             0.0, 0.0, 0.0, 0.25, 0.25, 0.5, 0.5, 0.5, 0.75, 0.75, 1.0]
 | |
|     assert list(quantized((0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1), 5)) == [
 | |
|             0.0, 0.0, 0.2, 0.2, 0.4, 0.4, 0.6, 0.6, 0.8, 0.8, 1.0]
 | |
|     assert list(quantized((0, 0.25, 0.5, 0.75, 1.0, 1.5, 1.75, 2.0), 2, 0, 2)) == [
 | |
|             0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 2.0]
 | |
|     assert list(quantized((1, 1.25, 1.5, 1.75, 2.0, 2.5, 2.75, 3.0), 2, 1, 3)) == [
 | |
|             1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0]
 | |
| 
 | |
| def test_booleanized():
 | |
|     with pytest.raises(ValueError):
 | |
|         list(booleanized((), 0, 0))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(booleanized((), 1, 1))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(booleanized((), 1, 0))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(booleanized((), 0, 0.5, -0.2))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(booleanized((), 0, 0.5, 0.5))
 | |
|     assert list(booleanized((), 0, 0.5)) == []
 | |
|     assert list(booleanized((0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1), 0, 0.5)) == [
 | |
|             True, True, True, True, True, True, False, False, False, False, False]
 | |
|     assert list(booleanized((0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 0), 0.25, 0.75)) == [
 | |
|             False, False, False, True, True, True, True, True, False, False, False, False]
 | |
|     assert list(booleanized((0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 0), 0.25, 0.75, 0.2)) == [
 | |
|             False, False, False, False, False, True, True, True, True, True, False, False]
 | |
|     assert list(booleanized((1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0, 1), 0.25, 0.75)) == [
 | |
|             False, False, False, True, True, True, True, True, False, False, False, False]
 | |
|     assert list(booleanized((1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0, 1), 0.25, 0.75, 0.2)) == [
 | |
|             False, False, False, False, False, True, True, True, True, True, False, False]
 | |
| 
 | |
| def test_all_values():
 | |
|     assert list(all_values(())) == []
 | |
|     assert list(all_values((False, True))) == [False, True]
 | |
|     assert list(all_values((0, 1, 0, 1), (0, 0, 0, 1))) == [0, 0, 0, 1]
 | |
| 
 | |
| def test_any_values():
 | |
|     assert list(any_values(())) == []
 | |
|     assert list(any_values((False, True))) == [False, True]
 | |
|     assert list(any_values((0, 1, 0, 1), (0, 0, 0, 1))) == [0, 1, 0, 1]
 | |
| 
 | |
| def test_averaged():
 | |
|     assert list(averaged(())) == []
 | |
|     assert list(averaged((0, 0.5, 1))) == [0, 0.5, 1]
 | |
|     assert list(averaged((0, 0.5, 1), (1, 1, 1))) == [0.5, 0.75, 1]
 | |
| 
 | |
| def test_summed():
 | |
|     assert list(summed(())) == []
 | |
|     assert list(summed((0, 0.5, 0.5, 1))) == [0, 0.5, 0.5, 1]
 | |
|     assert list(summed((0, 0.5, 0.5, 1), (1, 0.5, 1, 1))) == [1, 1, 1.5, 2]
 | |
| 
 | |
| def test_multiplied():
 | |
|     assert list(multiplied(())) == []
 | |
|     assert list(multiplied((0, 0.5, 0.5, 1))) == [0, 0.5, 0.5, 1]
 | |
|     assert list(multiplied((0, 0.5, 0.5, 1), (1, 0.5, 1, 1))) == [0, 0.25, 0.5, 1]
 | |
| 
 | |
| def test_queued():
 | |
|     with pytest.raises(ValueError):
 | |
|         list(queued((), 0))
 | |
|     assert list(queued((), 5)) == []
 | |
|     assert list(queued((1, 2, 3, 4, 5), 5)) == [1]
 | |
|     assert list(queued((1, 2, 3, 4, 5, 6), 5)) == [1, 2]
 | |
| 
 | |
| def test_smoothed():
 | |
|     with pytest.raises(ValueError):
 | |
|         list(smoothed((), 0))
 | |
|     assert list(smoothed((), 5)) == []
 | |
|     assert list(smoothed((1, 2, 3, 4, 5), 5)) == [3.0]
 | |
|     assert list(smoothed((1, 2, 3, 4, 5, 6), 5)) == [3.0, 4.0]
 | |
|     assert list(smoothed((1, 2, 3, 4, 5, 6), 5, average=mean)) == [3.0, 4.0]
 | |
|     assert list(smoothed((1, 1, 1, 4, 5, 5), 5, average=mean)) == [2.4, 3.2]
 | |
|     assert list(smoothed((1, 1, 1, 4, 5, 5), 5, average=median)) == [1, 4]
 | |
| 
 | |
| def test_pre_delayed():
 | |
|     with pytest.raises(ValueError):
 | |
|         list(pre_delayed((), -1))
 | |
|     assert list(pre_delayed((), 0.01)) == []
 | |
|     count = 0
 | |
|     start = time()
 | |
|     for v in pre_delayed((0, 0, 0), 0.01):
 | |
|         count += 1
 | |
|         assert v == 0
 | |
|         assert time() - start >= 0.01
 | |
|         start = time()
 | |
|     assert count == 3
 | |
| 
 | |
| def test_post_delayed():
 | |
|     with pytest.raises(ValueError):
 | |
|         list(post_delayed((), -1))
 | |
|     assert list(post_delayed((), 0.01)) == []
 | |
|     count = 0
 | |
|     start = time()
 | |
|     for v in post_delayed((1, 2, 2), 0.01):
 | |
|         count += 1
 | |
|         if v == 1:
 | |
|             assert time() - start < 0.01
 | |
|         elif v == 2:
 | |
|             assert time() - start >= 0.01
 | |
|         else:
 | |
|             assert False
 | |
|         start = time()
 | |
|     assert time() - start >= 0.01
 | |
|     assert count == 3
 | |
| 
 | |
| def test_pre_periodic_filtered():
 | |
|     with pytest.raises(ValueError):
 | |
|         list(pre_periodic_filtered((), 2, -1))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(pre_periodic_filtered((), 0, 0))
 | |
|     assert list(pre_periodic_filtered((), 2, 0)) == []
 | |
|     assert list(pre_periodic_filtered((1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 2, 0)) == [3, 4, 5, 6, 7, 8, 9, 10]
 | |
|     assert list(pre_periodic_filtered((1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 1, 1)) == [2, 4, 6, 8, 10]
 | |
|     assert list(pre_periodic_filtered((1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 1, 2)) == [2, 3, 5, 6, 8, 9]
 | |
|     assert list(pre_periodic_filtered((1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 2, 1)) == [3, 6, 9]
 | |
| 
 | |
| def test_post_periodic_filtered():
 | |
|     with pytest.raises(ValueError):
 | |
|         list(post_periodic_filtered((), 1, 0))
 | |
|     with pytest.raises(ValueError):
 | |
|         list(post_periodic_filtered((), 0, 1))
 | |
|     assert list(pre_periodic_filtered((), 1, 1)) == []
 | |
|     assert list(post_periodic_filtered((1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 1, 1)) == [1, 3, 5, 7, 9]
 | |
|     assert list(post_periodic_filtered((1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 1, 2)) == [1, 4, 7, 10]
 | |
|     assert list(post_periodic_filtered((1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 2, 1)) == [1, 2, 4, 5, 7, 8, 10]
 | |
| 
 | |
| def test_random_values():
 | |
|     for _, v in zip(range(1000), random_values()):
 | |
|         assert 0 <= v <= 1
 | |
| 
 | |
| def test_sin_values():
 | |
|     firstval = None
 | |
|     for i, v in zip(range(1000), sin_values()):
 | |
|         assert -1 <= v <= 1
 | |
|         assert isclose(v, sin(radians(i)), abs_tol=1e-9)
 | |
|         if i == 0:
 | |
|             firstval = v
 | |
|         else:
 | |
|             if i % 360 == 0:
 | |
|                 assert v == firstval
 | |
|     for period in (360, 100):
 | |
|         firstval = None
 | |
|         for i, v in zip(range(1000), sin_values(period)):
 | |
|             assert -1 <= v <= 1
 | |
|             if i == 0:
 | |
|                 firstval = v
 | |
|             else:
 | |
|                 if i % period == 0:
 | |
|                     assert v == firstval
 | |
| 
 | |
| def test_cos_values():
 | |
|     firstval = None
 | |
|     for i, v in zip(range(1000), cos_values()):
 | |
|         assert -1 <= v <= 1
 | |
|         assert isclose(v, cos(radians(i)), abs_tol=1e-9)
 | |
|         if i == 0:
 | |
|             firstval = v
 | |
|         else:
 | |
|             if i % 360 == 0:
 | |
|                 assert v == firstval
 | |
|     for period in (360, 100):
 | |
|         firstval = None
 | |
|         for i, v in zip(range(1000), cos_values(period)):
 | |
|             assert -1 <= v <= 1
 | |
|             if i == 0:
 | |
|                 firstval = v
 | |
|             else:
 | |
|                 if i % period == 0:
 | |
|                     assert v == firstval
 |