mirror of
				https://github.com/KevinMidboe/python-gpiozero.git
				synced 2025-10-29 17:50:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			273 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			273 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
 | |
|         else:
 | |
|             assert v == 2
 | |
|             assert time() - start >= 0.01
 | |
|         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
 |