#!/usr/bin/env python3 """ Test for saving and loading patterns Run with: mpremote run test/test_patterns_save_load.py """ import json import uasyncio as asyncio from settings import Settings from patterns import Patterns async def test_patterns_save_load(): """Test saving and loading patterns""" print("Testing patterns save and load functionality...") # Test 1: Initialize patterns and check initial state print("\nTest 1: Initialize patterns") s = Settings() pin = s.get("led_pin", 10) num_leds = s.get("num_leds", 30) p1 = Patterns(pin=pin, num_leds=num_leds) print(f"Initial patterns count: {len(p1.patterns)}") print(f"Available patterns: {list(p1.patterns.keys())}") print(f"Selected pattern: {p1.selected}") # Test 2: Try to save patterns (will fail because patterns contain functions) print("\nTest 2: Attempt to save patterns") try: result = p1.save() if result: print("✓ Patterns saved successfully") else: print("✗ Patterns save failed (expected - patterns contain functions)") except Exception as e: print(f"✗ Exception during save: {e}") # Test 3: Try to load patterns print("\nTest 3: Attempt to load patterns") try: result = p1.load() if result: print("✓ Patterns loaded successfully") print(f"Patterns after load: {list(p1.patterns.keys())}") else: print("✗ Patterns load failed") except Exception as e: print(f"✗ Exception during load: {e}") # Test 4: Test with empty patterns dict (simulating custom patterns) print("\nTest 4: Test save/load with empty patterns dict") p2 = Patterns(pin=pin, num_leds=num_leds) # Store original patterns original_patterns = p2.patterns.copy() # Clear patterns to test save/load with empty dict p2.patterns = {} try: result = p2.save() if result: print("✓ Empty patterns dict saved successfully") else: print("✗ Failed to save empty patterns dict") except Exception as e: print(f"✗ Exception saving empty patterns: {e}") # Try to load p3 = Patterns(pin=pin, num_leds=num_leds) p3.patterns = {} # Start with empty try: result = p3.load() if result: print("✓ Patterns loaded successfully") print(f"Patterns count after load: {len(p3.patterns)}") else: print("✗ Failed to load patterns") except Exception as e: print(f"✗ Exception loading patterns: {e}") # Restore original patterns p2.patterns = original_patterns p3.patterns = original_patterns # Test 5: Verify patterns object state print("\nTest 5: Verify patterns object state") print(f"Patterns object type: {type(p1)}") print(f"Has save method: {hasattr(p1, 'save')}") print(f"Has load method: {hasattr(p1, 'load')}") print(f"PATTERNS_FILE: {p1.PATTERNS_FILE}") # Test 6: Test pattern selection persists print("\nTest 6: Test pattern selection") test_pattern = "rainbow" if test_pattern in p1.patterns: p1.select(test_pattern) print(f"Selected pattern: {p1.selected}") if p1.selected == test_pattern: print("✓ Pattern selection works") else: print(f"✗ Pattern selection failed. Expected '{test_pattern}', got '{p1.selected}'") else: print(f"Pattern '{test_pattern}' not available") print("\n=== Patterns Save/Load test complete ===") if __name__ == "__main__": asyncio.run(test_patterns_save_load())