update some deisng parameters and add new cases

This commit is contained in:
2026-07-29 14:32:22 -07:00
parent 683697604a
commit 45a77885f9
34 changed files with 4602 additions and 79 deletions
+94 -1
View File
@@ -9,11 +9,77 @@ class ConfigTest < Minitest::Test
def test_default_case_has_expected_parts_and_dimensions
assert_equal %w[body lid], config.printable_parts
assert_in_delta 60.8, config.dimensions["length"], 0.01
assert_in_delta 61.6, config.dimensions["length"], 0.01
assert_in_delta 41.66, config.dimensions["width"], 0.01
assert_in_delta 12.25, config.parameters["wing_pitch"], 0.001
assert_in_delta 6.0, config.parameters["gps_antenna_height"], 0.001
assert_in_delta 2.4, config.parameters["oled_component_height"], 0.001
assert_in_delta 1.5, config.parameters["oled_display_height"], 0.001
assert_in_delta 2.0, config.parameters["usb_board_wall_gap"], 0.001
assert config.parameters["usb_opening_enabled"]
assert config.parameters["usb_guide_enabled"]
assert_equal ["3mf"], config.outputs["formats"]
end
def test_gps_height_uses_stack_pitch_antenna_height_and_top_gap
subject = config
subject.parameters["top_profile"] = "gps"
parameters = subject.parameters
expected_electronics_height =
parameters["wing_pitch"] + parameters["gps_antenna_height"] +
parameters["gps_top_gap"]
assert_in_delta 23.25, expected_electronics_height, 0.001
assert_in_delta 35.85, subject.dimensions["height"] + parameters["lid_thickness"], 0.001
end
def test_oled_height_uses_tallest_component_not_display_reference
subject = config
subject.parameters["top_profile"] = "oled128x64"
original_height = subject.dimensions["height"]
subject.parameters["oled_display_height"] = 10.0
assert_in_delta original_height, subject.dimensions["height"], 0.001
end
def test_older_config_receives_default_oled_display_height
data = FeatherCaseWizard::Config.deep_copy(config.data)
data["parameters"].delete("oled_display_height")
loaded = FeatherCaseWizard::Config.new(data)
assert_in_delta 1.5, loaded.parameters["oled_display_height"], 0.001
end
def test_older_config_preserves_opening_without_enabling_guide
data = FeatherCaseWizard::Config.deep_copy(config.data)
data["parameters"].delete("usb_opening_enabled")
data["parameters"].delete("usb_guide_enabled")
loaded = FeatherCaseWizard::Config.new(data)
assert loaded.parameters["usb_opening_enabled"]
refute loaded.parameters["usb_guide_enabled"]
end
def test_usb_guide_requires_opening
subject = config
subject.parameters["usb_opening_enabled"] = false
error = assert_raises(FeatherCaseWizard::ConfigError) { subject.validate! }
assert_match(/guide requires/, error.message)
end
def test_end_clearances_expand_case_length
subject = config
subject.parameters["usb_board_wall_gap"] = 20.0
subject.parameters["board_rear_clearance"] = 20.0
assert_in_delta 95.6, subject.dimensions["length"], 0.01
end
def test_oled_buttons_and_selected_coupons_are_printable
subject = config
subject.parameters["top_profile"] = "oled128x64"
@@ -50,6 +116,33 @@ class ConfigTest < Minitest::Test
assert_match(/floor/, error.message)
end
def test_cutouts_on_same_wall_require_minimum_web
subject = config
first = cutout("rear", 18.0).merge("name" => "first")
second = cutout("rear", 24.0).merge("name" => "second")
subject.data["cutouts"] = [first, second]
error = assert_raises(FeatherCaseWizard::ConfigError) { subject.validate! }
assert_match(/too close/, error.message)
end
def test_front_cutout_cannot_overlap_usb_opening
subject = config
subject.data["cutouts"] = [
cutout("front", subject.dimensions["width"] / 2).merge("z" => 11.0)
]
error = assert_raises(FeatherCaseWizard::ConfigError) { subject.validate! }
assert_match(/USB opening or guide/, error.message)
end
def test_front_cutout_can_clear_usb_reservation
subject = config
subject.data["cutouts"] = [cutout("front", 10.0).merge("z" => 11.0)]
assert_same subject, subject.validate!
end
def test_yaml_round_trip_preserves_resolved_cutouts
subject = config
subject.data["cutouts"] = [cutout("left", 20.0)]