Tasmota/lib/libesp32/berry_animation/src/tests/filled_animation_test.be

180 lines
6.1 KiB
Plaintext

# Test for animation.solid
#
# This test verifies that the animation.solidectly with different color providers
# using the new parameterized class specification and engine-controlled timing.
import animation
# Create a mock engine for testing
class MockEngine
var time_ms
var strip_length
def init()
self.time_ms = 1000 # Fixed time for testing
self.strip_length = 10 # Mock strip length
end
def get_strip_length()
return self.strip_length
end
# Fake add() method for value provider auto-registration
def add(obj)
return true
end
end
var mock_engine = MockEngine()
# Create a frame buffer for testing
var frame = animation.frame_buffer(10, 1)
# Test 1: animation.solid with a solid color
print("Test 1: animation.solid with a solid color")
var solid_anim = animation.solid(mock_engine)
solid_anim.color = 0xFF0000FF
solid_anim.priority = 10
solid_anim.duration = 0
solid_anim.loop = false # Use boolean instead of integer
solid_anim.opacity = 255
assert(solid_anim != nil, "Failed to create solid animation")
# Start the animation
solid_anim.start()
assert(solid_anim.is_running, "Animation should be running")
# Update and render
solid_anim.update(mock_engine.time_ms)
frame.clear()
var result = solid_anim.render(frame, mock_engine.time_ms, mock_engine.strip_length)
assert(result, "Render should return true")
# Check the color of the first pixel
var pixel_color = frame.get_pixel_color(0)
assert(pixel_color == 0xFF0000FF, f"Expected 0xFF0000FF, got {pixel_color:08X}")
# Test 2: animation.solid with a color cycle provider
print("Test 2: animation.solid with a color cycle provider")
var cycle_provider = animation.color_cycle(mock_engine)
cycle_provider.colors = bytes("FF0000FFFF00FF00FFFF0000") # BGR colors in AARRGGBB format
cycle_provider.period = 1000 # 1 second cycle period
# Note: transition_type removed - now uses "brutal" color switching
var cycle_anim = animation.solid(mock_engine)
cycle_anim.color = cycle_provider
cycle_anim.priority = 10
cycle_anim.duration = 0
cycle_anim.loop = false # Use boolean instead of integer
cycle_anim.opacity = 255
assert(cycle_anim != nil, "Failed to create cycle animation")
# Start the animation
cycle_anim.start()
assert(cycle_anim.is_running, "Animation should be running")
# Update and render
cycle_anim.update(mock_engine.time_ms)
frame.clear()
result = cycle_anim.render(frame, mock_engine.time_ms, mock_engine.strip_length)
assert(result, "Render should return true")
# Test 3: animation.solid with a rich palette provider
print("Test 3: animation.solid with a rich palette provider")
var rich_provider = animation.rich_palette(mock_engine)
rich_provider.colors = animation.PALETTE_RAINBOW # Use the rainbow palette
rich_provider.period = 1000 # 1 second cycle period
# Note: transition_type removed - rich palette uses smooth transitions
rich_provider.brightness = 255 # Full brightness
var palette_anim = animation.solid(mock_engine)
palette_anim.color = rich_provider
palette_anim.priority = 10
palette_anim.duration = 0
palette_anim.loop = false # Use boolean instead of integer
palette_anim.opacity = 255
assert(palette_anim != nil, "Failed to create palette animation")
# Start the animation
palette_anim.start()
assert(palette_anim.is_running, "Animation should be running")
# Update and render
palette_anim.update(mock_engine.time_ms)
frame.clear()
result = palette_anim.render(frame, mock_engine.time_ms, mock_engine.strip_length)
assert(result, "Render should return true")
# Test 4: animation.solid with a composite provider
print("Test 4: animation.solid with a composite provider")
var rich_provider2 = animation.rich_palette(mock_engine)
rich_provider2.colors = animation.PALETTE_RAINBOW
rich_provider2.period = 1000
# Note: transition_type removed
rich_provider2.brightness = 255
var composite_provider = animation.composite_color(mock_engine)
composite_provider.providers = [cycle_provider, rich_provider2]
composite_provider.blend_mode = 0 # Overlay blend mode
var composite_anim = animation.solid(mock_engine)
composite_anim.color = composite_provider
composite_anim.priority = 10
composite_anim.duration = 0
composite_anim.loop = false # Use boolean instead of integer
composite_anim.opacity = 255
assert(composite_anim != nil, "Failed to create composite animation")
# Start the animation
composite_anim.start()
assert(composite_anim.is_running, "Animation should be running")
# Update and render
composite_anim.update(mock_engine.time_ms)
frame.clear()
result = composite_anim.render(frame, mock_engine.time_ms, mock_engine.strip_length)
assert(result, "Render should return true")
# Test 5: Changing color provider dynamically
print("Test 5: Changing color provider dynamically")
var dynamic_anim = animation.solid(mock_engine)
dynamic_anim.color = 0xFF0000FF
dynamic_anim.priority = 10
dynamic_anim.duration = 0
dynamic_anim.loop = false # Use boolean instead of integer
dynamic_anim.opacity = 255
assert(dynamic_anim != nil, "Failed to create dynamic animation")
# Start the animation
dynamic_anim.start()
assert(dynamic_anim.is_running, "Animation should be running")
# Update and render with initial color
dynamic_anim.update(mock_engine.time_ms)
frame.clear()
result = dynamic_anim.render(frame, mock_engine.time_ms, mock_engine.strip_length)
assert(result, "Render should return true")
# Check the color of the first pixel
pixel_color = frame.get_pixel_color(0)
assert(pixel_color == 0xFF0000FF, f"Expected 0xFF0000FF, got {pixel_color:08X}")
# Change to a different color using virtual member assignment
dynamic_anim.color = 0x00FF00FF # Green
dynamic_anim.update(mock_engine.time_ms)
frame.clear()
result = dynamic_anim.render(frame, mock_engine.time_ms, mock_engine.strip_length)
assert(result, "Render should return true")
# Check the color of the first pixel
pixel_color = frame.get_pixel_color(0)
assert(pixel_color == 0x00FF00FF, f"Expected 0x00FF00FF, got {pixel_color:08X}")
# Change to a color provider using virtual member assignment
dynamic_anim.color = cycle_provider
dynamic_anim.update(mock_engine.time_ms)
frame.clear()
result = dynamic_anim.render(frame, mock_engine.time_ms, mock_engine.strip_length)
assert(result, "Render should return true")
print("All tests passed!")