Files
2026-09-07 12:11:43 -07:00

76 lines
2.7 KiB
Ruby

# frozen_string_literal: true
require "test_helper"
class SizingTest < Minitest::Test
def setup
@data = MoonModel::DataSet.new
end
def datum_config(exaggeration, assembly: "auto")
MoonModel::Config.new(
"size" => { "input" => "diameter", "value" => 8.0, "unit" => "in", "meaning" => "datum" },
"vertical_exaggeration" => exaggeration,
"assembly" => assembly, "shell" => { "interior" => "hollow" },
"resolution" => { "longitude_segments" => 48 }
)
end
def test_solid_one_piece_allows_more_relief_before_radial_collapse
hollow = datum_config(1, assembly: "one_piece")
solid = MoonModel::Config.new(hollow.to_h.merge("shell" => hollow["shell"].merge("interior" => "solid")))
assert_operator MoonModel::Sizing.maximum_safe_exaggeration(solid, @data), :>,
MoonModel::Sizing.maximum_safe_exaggeration(hollow, @data)
end
def test_eight_inch_relief_uses_consistent_units
one = MoonModel::Sizing.calculate(datum_config(1), @data)
ten = MoonModel::Sizing.calculate(datum_config(10), @data)
assert_in_delta 1.153, one.relief_range_mm, 0.001
assert_in_delta 11.532, ten.relief_range_mm, 0.001
assert_operator ten.final_envelope_mm, :>, one.final_envelope_mm
assert_operator ten.maximum_radius_mm, :>, ten.minimum_radius_mm
assert_operator ten.maximum_radius_mm, :>, ten.datum_diameter_mm / 2.0
end
def test_single_color_grid_is_included_in_conservative_minimum_radius
plain = datum_config(5)
grid = datum_config(5)
grid = MoonModel::Config.new(grid.to_h.merge("grid" => { "enabled" => true, "depth_mm" => 0.7 }))
plain_result = MoonModel::Sizing.calculate(plain, @data)
grid_result = MoonModel::Sizing.calculate(grid, @data)
assert_in_delta 0.7, plain_result.minimum_radius_mm - grid_result.minimum_radius_mm, 0.001
end
def test_unsafe_exaggeration_is_rejected_with_limit
error = assert_raises(ArgumentError) { MoonModel::Sizing.calculate(datum_config(1000), @data) }
assert_match(/maximum is 18[89]x/, error.message)
end
def test_exaggerated_datum_can_automatically_select_sections
result = MoonModel::Sizing.calculate(datum_config(100), @data)
assert result.segmented?
assert_equal "automatic", result.mode_source
end
def test_final_envelope_remains_requested_size
config = MoonModel::Config.new(
"size" => { "input" => "diameter", "value" => 8.0, "unit" => "in", "meaning" => "final_envelope" },
"vertical_exaggeration" => 10,
"resolution" => { "longitude_segments" => 48 }
)
result = MoonModel::Sizing.calculate(config, @data)
assert_in_delta 203.2, result.final_envelope_mm, 0.001
refute result.segmented?
end
end