diff --git a/tests/test_arc_1d.py b/tests/test_arc_1d.py new file mode 100644 index 00000000..23a32ce3 --- /dev/null +++ b/tests/test_arc_1d.py @@ -0,0 +1,75 @@ +import random +import pytest +from reasoning_gym.cognition.arc_1d import ( + task_move_n_pix, task_move_n_pix_wrapped, task_gravity, task_gravity_counting, + task_gravity_antigravity, task_block_touch_dot, task_block_touch_dot_n_pix, + task_block_scale_to_dot, task_two_points_and_fill, task_reflect_block_with_border_pixel, + task_reflect_block_with_border_pixel_random, task_reflect_block_around_dot, + task_block_and_noise_remove, task_block_and_noise_remove_inside, + task_copy_block_to_dots, task_copy_block_to_dots_colors, task_paint_biggest_block, + task_sort_blocks_by_size, task_sort_complete_sequence, task_recolor_blocks_by_size, + task_gravity_one_step, task_move_block_by_own_size, task_change_to_five, + task_recolor_blocks_from_palette, task_duplicate_block_from_seeds, + task_fill_from_pixel, task_mark_size_two_blocks, task_fill_until_collision, + task_repeat_pattern_full, task_gravity_weighted_colors, task_color_left_half_blocks +) + +def test_all_arc_1d_tasks(): + """Test that all ARC 1D task functions can be executed without exceptions.""" + rng = random.Random(42) # Fixed seed for reproducibility + size = 20 # Reasonable size for testing + + # Test all task functions + tasks = [ + (task_move_n_pix, {"move_pix": 2, "solid": True}), + (task_move_n_pix_wrapped, {"move_pix": 2, "solid": True}), + (task_gravity, {}), + (task_gravity_counting, {}), + (task_gravity_antigravity, {}), + (task_block_touch_dot, {}), + (task_block_touch_dot_n_pix, {"move_pix": 2}), + (task_block_scale_to_dot, {}), + (task_two_points_and_fill, {}), + (task_reflect_block_with_border_pixel, {}), + (task_reflect_block_with_border_pixel_random, {}), + (task_reflect_block_around_dot, {}), + (task_block_and_noise_remove, {}), + (task_block_and_noise_remove_inside, {}), + (task_copy_block_to_dots, {}), + (task_copy_block_to_dots_colors, {}), + (task_paint_biggest_block, {}), + (task_sort_blocks_by_size, {}), + (task_sort_complete_sequence, {}), + (task_recolor_blocks_by_size, {}), + (task_gravity_one_step, {}), + (task_move_block_by_own_size, {}), + (task_change_to_five, {}), + (task_recolor_blocks_from_palette, {}), + (task_duplicate_block_from_seeds, {}), + (task_fill_from_pixel, {}), + (task_mark_size_two_blocks, {}), + (task_fill_until_collision, {}), + (task_repeat_pattern_full, {}), + (task_gravity_weighted_colors, {}), + (task_color_left_half_blocks, {}) + ] + + for task_func, kwargs in tasks: + # Try multiple times as some functions might return None for certain inputs + success = False + for _ in range(10): # Try up to 10 times + try: + result = task_func(size, rng, **kwargs) + if result is not None: + success = True + # Basic structure checks + assert isinstance(result, dict) + assert "input" in result + assert "output" in result + assert len(result["input"]) == size + assert len(result["output"]) == size + break + except Exception as e: + pytest.fail(f"Task {task_func.__name__} failed with error: {str(e)}") + + assert success, f"Task {task_func.__name__} always returned None in 10 attempts"