diff --git a/Cargo.lock b/Cargo.lock index dd95df6..7e93fee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -864,6 +864,18 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "windows-sys 0.59.0", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1250,6 +1262,12 @@ dependencies = [ "serde", ] +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -1685,6 +1703,12 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + [[package]] name = "glow" version = "0.16.0" @@ -2218,6 +2242,19 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "insta" +version = "1.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50259abbaa67d11d2bcafc7ba1d094ed7a0c70e3ce893f0d0997f73558cb3084" +dependencies = [ + "console", + "linked-hash-map", + "once_cell", + "pin-project", + "similar", +] + [[package]] name = "interpolate_name" version = "0.2.4" @@ -2393,6 +2430,12 @@ dependencies = [ "redox_syscall 0.5.9", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -3500,6 +3543,12 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + [[package]] name = "renderdoc-sys" version = "1.1.0" @@ -3652,6 +3701,33 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" +[[package]] +name = "rstest" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fc39292f8613e913f7df8fa892b8944ceb47c247b78e1b1ae2f09e019be789d" +dependencies = [ + "rstest_macros", + "rustc_version", +] + +[[package]] +name = "rstest_macros" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f168d99749d307be9de54d23fd226628d99768225ef08f6ffb52e0182a27746" +dependencies = [ + "cfg-if", + "glob", + "proc-macro2", + "quote", + "regex", + "relative-path", + "rustc_version", + "syn", + "unicode-ident", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -3664,6 +3740,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "0.38.44" @@ -3809,8 +3894,10 @@ name = "seance" version = "0.1.0" dependencies = [ "ascii", + "insta", "log", "lyon_algorithms", + "rstest", "serde", "usvg 0.45.0", ] @@ -3859,6 +3946,12 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + [[package]] name = "serde" version = "1.0.218" @@ -3974,6 +4067,12 @@ dependencies = [ "quote", ] +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" + [[package]] name = "simple-easing" version = "1.0.1" diff --git a/Cargo.toml b/Cargo.toml index dad2a81..93b7017 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,3 +26,5 @@ opt-level = 2 serde = { version = "1", features = ["derive"] } serde_json = "1.0.120" usvg = "0.45.0" +insta = "1.42.2" +rstest = { version = "0.25.0", default-features = false } diff --git a/seance/Cargo.toml b/seance/Cargo.toml index c8d487b..ccfeb46 100644 --- a/seance/Cargo.toml +++ b/seance/Cargo.toml @@ -19,3 +19,7 @@ log = "0.4" lyon_algorithms = "1.0.4" serde = { version = "1", features = ["derive"] } usvg.workspace = true + +[dev-dependencies] +insta.workspace = true +rstest.workspace = true diff --git a/seance/src/hpgl.rs b/seance/src/hpgl.rs index 56158ee..3e4dea0 100644 --- a/seance/src/hpgl.rs +++ b/seance/src/hpgl.rs @@ -111,3 +111,33 @@ fn trace_path(path: &ResolvedPath) -> String { hpgl } + +#[cfg(test)] +mod tests { + use super::*; + use rstest::rstest; + + #[rstest] + #[case(3, "SP4;")] + #[case(0, "SP1;")] + fn test_pen_change(#[case] idx: usize, #[case] expected: &str) { + assert_eq!(&pen_change(idx), expected); + // TODO: what is the desired behaviour for usize::MAX ? + } + + #[test] + fn test_generate_hpgl_failures() { + let mut passes = crate::default_passes::default_passes(); + + assert_eq!( + generate_hpgl(&HashMap::new(), &passes), + "No tool passes enabled".to_string() + ); + + passes[0].set_enabled(true); + assert_eq!( + generate_hpgl(&HashMap::new(), &passes[0..5]), + "Exactly 16 tool passes are required".to_string() + ) + } +} diff --git a/seance/src/laser_passes.rs b/seance/src/laser_passes.rs index 143bc8d..1d11ecc 100644 --- a/seance/src/laser_passes.rs +++ b/seance/src/laser_passes.rs @@ -124,3 +124,69 @@ impl ToolPass { self.enabled = new_state; } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_tool_pass_new() { + assert_eq!( + ToolPass::new("non-restricted pass".to_string(), 0, 0, 0, 500, 100, true), + ToolPass { + name: "non-restricted pass".to_string(), + colour: [0, 0, 0], + power: 500, + speed: 100, + enabled: true + } + ); + + assert_eq!( + ToolPass::new( + "truncated power & speed pass".to_string(), + 0, + 0, + 0, + 10_000, + u64::MAX, + true + ), + ToolPass { + name: "truncated power & speed pass".to_string(), + colour: [0, 0, 0], + power: 1000, + speed: 1000, + enabled: true + } + ); + } + + #[test] + fn test_tool_pass_set_speed() { + let mut pass = ToolPass::new("".to_string(), 0, 0, 0, 100, 100, false); + assert_eq!(pass.speed, 100); + + // should not truncate + pass.set_speed(500); + assert_eq!(pass.speed, 500); + + // should truncate + pass.set_speed(1_000_000); + assert_eq!(pass.speed, 1000); + } + + #[test] + fn test_tool_pass_set_power() { + let mut pass = ToolPass::new("".to_string(), 0, 0, 0, 100, 100, false); + assert_eq!(pass.power, 100); + + // should not truncate + pass.set_power(10); + assert_eq!(pass.power, 10); + + // should truncate + pass.set_power(1001); + assert_eq!(pass.power, 1000); + } +} diff --git a/seance/src/lib.rs b/seance/src/lib.rs index 1360f96..7e18f68 100644 --- a/seance/src/lib.rs +++ b/seance/src/lib.rs @@ -3,10 +3,10 @@ //! A utility for talking to devices that speak HPGL. pub mod default_passes; -mod hpgl; +pub mod hpgl; mod laser_passes; -mod paths; -mod pcl; +pub mod paths; +pub mod pcl; pub mod svg; use std::{fs, path::PathBuf}; diff --git a/seance/src/paths.rs b/seance/src/paths.rs index e9b606f..47dde2a 100644 --- a/seance/src/paths.rs +++ b/seance/src/paths.rs @@ -20,6 +20,7 @@ const MM_PER_PLOTTER_UNIT: f32 = 0.025; /// This is a point that is along a path that we wish to trace with the tool. /// The units are HPGL/2 units, which are rather nebulous and may vary from /// machine to machine in terms of their translation to mm. +#[derive(Debug, PartialEq, Eq)] pub struct ResolvedPoint { /// Horizontal axis position. pub x: i16, @@ -202,7 +203,7 @@ pub fn convert_points_to_plotter_units( } /// A point in terms of mm. -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq)] pub struct PointInMillimeters { /// Horizontal axis. pub x: f32, @@ -297,3 +298,76 @@ pub fn mm_to_hpgl_units(mm: f32, is_x_axis: bool) -> i16 { let position_mm = if is_x_axis { mm } else { BED_HEIGHT_MM - mm }; (position_mm / MM_PER_PLOTTER_UNIT).round() as i16 } + +#[cfg(test)] +mod tests { + use super::*; + use rstest::rstest; + + #[rstest] + #[case::ten_mm(10.0, false, 18128)] + #[case::zero_mm(0.0, true, 0)] + #[case::minus_zero_mm(-0.0, true, 0)] + // extreme values + #[case::upper_limit_mm(f32::MAX, true, 32767)] + #[case::approx_max_computable(819.175, true, 32767)] + #[case::lower_limit_mm(f32::MIN, true, -32768)] + #[case::approx_min_computable(-820.0, true, -32768)] + fn test_mm_to_hpgl_units(#[case] val: f32, #[case] is_x_axis: bool, #[case] expected: i16) { + assert_eq!(mm_to_hpgl_units(val, is_x_axis), expected); + } + + #[test] + fn test_points_in_mm_to_printer_units() { + let points = &[ + PointInMillimeters { x: 10.0, y: 10.0 }, + PointInMillimeters { x: 11.0, y: 10.0 }, + ]; + let expected = &[ + ResolvedPoint { x: 400, y: 18128 }, + ResolvedPoint { x: 440, y: 18128 }, + ]; + + assert_eq!(&points_in_mm_to_printer_units(points), expected); + } + + #[test] + fn test_filter_paths_to_tool_passes() { + let mut passes = crate::default_passes::default_passes(); + // enable black + passes[0].set_enabled(true); + + let mut paths = [ + // black, is enabled + ( + PathColour([0, 0, 0]), + vec![vec![PointInMillimeters { x: 15.0, y: 100.5 }]], + ), + // dark grey, not used as a tool pass + ( + PathColour([10, 10, 10]), + vec![vec![PointInMillimeters { x: 500.0, y: -10.0 }]], + ), + // white - present but not enabled + ( + PathColour([255, 255, 255]), + vec![vec![PointInMillimeters { + x: -1010.5, + y: -f32::MAX, + }]], + ), + ] + .into_iter() + .collect(); + + let expected = [( + PathColour([0, 0, 0]), + vec![vec![PointInMillimeters { x: 15.0, y: 100.5 }]], + )] + .into_iter() + .collect(); + + filter_paths_to_tool_passes(&mut paths, &passes); + assert_eq!(paths, expected) + } +} diff --git a/seance/tests/black_rectangle.svg b/seance/tests/black_rectangle.svg new file mode 100644 index 0000000..c1af79b --- /dev/null +++ b/seance/tests/black_rectangle.svg @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/seance/tests/snapshot_tests.rs b/seance/tests/snapshot_tests.rs new file mode 100644 index 0000000..303ba7a --- /dev/null +++ b/seance/tests/snapshot_tests.rs @@ -0,0 +1,74 @@ +use seance::ToolPass; + +#[test] +fn logo() { + let design_file = seance::svg::parse_svg( + &std::fs::read("../logo.svg").expect("failed to read logo SVG file"), + ) + .expect("failed to parse logo SVG data"); + + let design_name = "Logo"; + let offset = seance::DesignOffset { x: 0.0, y: 0.0 }; + + let mut tool_passes = seance::default_passes::default_passes(); + for tool in &mut tool_passes { + tool.set_enabled(true); + } + + let paths = seance::svg::get_paths_grouped_by_colour(&design_file); + let mut paths_in_mm = seance::resolve_paths(&paths, &offset, 1.0); + seance::paths::filter_paths_to_tool_passes(&mut paths_in_mm, &tool_passes); + let resolved_paths = seance::paths::convert_points_to_plotter_units(&paths_in_mm); + insta::assert_debug_snapshot!("logo plotted paths", &resolved_paths); + + let hpgl = seance::hpgl::generate_hpgl(&resolved_paths, &tool_passes); + insta::assert_snapshot!("logo HPGL output", &hpgl); + + let pcl = seance::pcl::wrap_hpgl_in_pcl(hpgl, design_name, &tool_passes); + insta::assert_snapshot!("logo PCL output", &pcl); +} + +#[test] +fn black_rectangle() { + let design_file = seance::svg::parse_svg( + &std::fs::read("tests/black_rectangle.svg").expect("failed to read rectangle SVG file"), + ) + .expect("failed to parse rectangle SVG data"); + + let design_name = "rectangle"; + let offset = seance::DesignOffset { x: 0.0, y: 0.0 }; + + let mut tool_passes = vec![ToolPass::new( + "Black Pass".to_string(), + 0, + 0, + 0, + 100, + 20, + true, + )]; + // add unused white passes + for i in 2..=16 { + tool_passes.push(ToolPass::new( + format!("White Pass #{i}"), + 255, + 255, + 255, + 100, + 20, + true, + )) + } + + let paths = seance::svg::get_paths_grouped_by_colour(&design_file); + let mut paths_in_mm = seance::resolve_paths(&paths, &offset, 1.0); + seance::paths::filter_paths_to_tool_passes(&mut paths_in_mm, &tool_passes); + let resolved_paths = seance::paths::convert_points_to_plotter_units(&paths_in_mm); + insta::assert_debug_snapshot!("rectangle plotted paths", &resolved_paths); + + let hpgl = seance::hpgl::generate_hpgl(&resolved_paths, &tool_passes); + insta::assert_snapshot!("rectangle HPGL output", &hpgl); + + let pcl = seance::pcl::wrap_hpgl_in_pcl(hpgl, design_name, &tool_passes); + insta::assert_snapshot!("rectangle PCL output", &pcl); +} diff --git a/seance/tests/snapshots/snapshot_tests__logo HPGL output.snap b/seance/tests/snapshots/snapshot_tests__logo HPGL output.snap new file mode 100644 index 0000000..d4d75d0 --- /dev/null +++ b/seance/tests/snapshots/snapshot_tests__logo HPGL output.snap @@ -0,0 +1,5 @@ +--- +source: seance/tests/snapshot_tests.rs +expression: "&hpgl" +--- +IN;SC;PU;SP1;LT;PU0,18528;PU0,18528;SP0;EC0;EC1;OE; diff --git a/seance/tests/snapshots/snapshot_tests__logo PCL output.snap b/seance/tests/snapshots/snapshot_tests__logo PCL output.snap new file mode 100644 index 0000000..45cdb39 --- /dev/null +++ b/seance/tests/snapshots/snapshot_tests__logo PCL output.snap @@ -0,0 +1,5 @@ +--- +source: seance/tests/snapshot_tests.rs +expression: "&pcl" +--- +%-12345XE!m4NLogo!v16R1111111111111111!v64I0400040004000400040004000400040004000400040004000400040004000400!v64V0020002000200020002000200020002000200020002000200020002000200020!v64P0100010001000100010001000100010001000100010001000100010001000100!v16D*t508R&u508R!r0N%1A!r1000I!r1000K!r500P*t508R&u508R!m0S!s1S%1BIN;SC;PU;SP1;LT;PU0,18528;PU0,18528;SP0;EC0;EC1;OE;%1AE%-12345X diff --git a/seance/tests/snapshots/snapshot_tests__logo plotted paths.snap b/seance/tests/snapshots/snapshot_tests__logo plotted paths.snap new file mode 100644 index 0000000..24a5199 --- /dev/null +++ b/seance/tests/snapshots/snapshot_tests__logo plotted paths.snap @@ -0,0 +1,5 @@ +--- +source: seance/tests/snapshot_tests.rs +expression: "&resolved_paths" +--- +{} diff --git a/seance/tests/snapshots/snapshot_tests__rectangle HPGL output.snap b/seance/tests/snapshots/snapshot_tests__rectangle HPGL output.snap new file mode 100644 index 0000000..ebb6e70 --- /dev/null +++ b/seance/tests/snapshots/snapshot_tests__rectangle HPGL output.snap @@ -0,0 +1,5 @@ +--- +source: seance/tests/snapshot_tests.rs +expression: "&hpgl" +--- +IN;SC;PU;SP1;LT;PU0,18528;SP1;PU3004,15124;PD3004,15124;PD3044,15124;PD3084,15124;PD3124,15124;PD3164,15124;PD3204,15124;PD3244,15124;PD3284,15124;PD3324,15124;PD3364,15124;PD3404,15124;PD3444,15124;PD3484,15124;PD3524,15124;PD3564,15124;PD3604,15124;PD3644,15124;PD3684,15124;PD3724,15124;PD3764,15124;PD3804,15124;PD3844,15124;PD3884,15124;PD3924,15124;PD3964,15124;PD4004,15124;PD4044,15124;PD4084,15124;PD4124,15124;PD4164,15124;PD4204,15124;PD4244,15124;PD4284,15124;PD4324,15124;PD4364,15124;PD4404,15124;PD4444,15124;PD4484,15124;PD4524,15124;PD4564,15124;PD4604,15124;PD4644,15124;PD4684,15124;PD4724,15124;PD4764,15124;PD4804,15124;PD4844,15124;PD4884,15124;PD4924,15124;PD4964,15124;PD5004,15124;PD5044,15124;PD5084,15124;PD5124,15124;PD5164,15124;PD5204,15124;PD5244,15124;PD5284,15124;PD5324,15124;PD5364,15124;PD5404,15124;PD5444,15124;PD5484,15124;PD5524,15124;PD5564,15124;PD5604,15124;PD5644,15124;PD5684,15124;PD5724,15124;PD5764,15124;PD5804,15124;PD5844,15124;PD5871,15111;PD5871,15071;PD5871,15031;PD5871,14991;PD5871,14951;PD5871,14911;PD5871,14871;PD5871,14831;PD5871,14791;PD5871,14751;PD5871,14711;PD5871,14671;PD5871,14631;PD5871,14591;PD5871,14551;PD5871,14511;PD5871,14471;PD5871,14431;PD5871,14391;PD5871,14351;PD5871,14311;PD5871,14271;PD5871,14231;PD5871,14191;PD5871,14151;PD5871,14111;PD5871,14071;PD5871,14031;PD5871,13991;PD5871,13951;PD5871,13911;PD5871,13871;PD5871,13831;PD5871,13791;PD5871,13751;PD5871,13711;PD5871,13671;PD5871,13631;PD5871,13591;PD5871,13551;PD5871,13511;PD5871,13471;PD5871,13431;PD5871,13391;PD5871,13351;PD5871,13311;PD5871,13271;PD5871,13231;PD5871,13191;PD5871,13151;PD5871,13111;PD5871,13071;PD5871,13031;PD5871,12991;PD5871,12951;PD5871,12911;PD5871,12871;PD5871,12831;PD5871,12791;PD5871,12751;PD5871,12711;PD5871,12671;PD5871,12631;PD5871,12591;PD5871,12551;PD5871,12511;PD5871,12471;PD5871,12431;PD5871,12391;PD5871,12351;PD5871,12311;PD5871,12271;PD5871,12231;PD5871,12191;PD5871,12151;PD5839,12143;PD5799,12143;PD5759,12143;PD5719,12143;PD5679,12143;PD5639,12143;PD5599,12143;PD5559,12143;PD5519,12143;PD5479,12143;PD5439,12143;PD5399,12143;PD5359,12143;PD5319,12143;PD5279,12143;PD5239,12143;PD5199,12143;PD5159,12143;PD5119,12143;PD5079,12143;PD5039,12143;PD4999,12143;PD4959,12143;PD4919,12143;PD4879,12143;PD4839,12143;PD4799,12143;PD4759,12143;PD4719,12143;PD4679,12143;PD4639,12143;PD4599,12143;PD4559,12143;PD4519,12143;PD4479,12143;PD4439,12143;PD4399,12143;PD4359,12143;PD4319,12143;PD4279,12143;PD4239,12143;PD4199,12143;PD4159,12143;PD4119,12143;PD4079,12143;PD4039,12143;PD3999,12143;PD3959,12143;PD3919,12143;PD3879,12143;PD3839,12143;PD3799,12143;PD3759,12143;PD3719,12143;PD3679,12143;PD3639,12143;PD3599,12143;PD3559,12143;PD3519,12143;PD3479,12143;PD3439,12143;PD3399,12143;PD3359,12143;PD3319,12143;PD3279,12143;PD3239,12143;PD3199,12143;PD3159,12143;PD3119,12143;PD3079,12143;PD3039,12143;PD3004,12147;PD3004,12187;PD3004,12227;PD3004,12267;PD3004,12307;PD3004,12347;PD3004,12387;PD3004,12427;PD3004,12467;PD3004,12507;PD3004,12547;PD3004,12587;PD3004,12627;PD3004,12667;PD3004,12707;PD3004,12747;PD3004,12787;PD3004,12827;PD3004,12867;PD3004,12907;PD3004,12947;PD3004,12987;PD3004,13027;PD3004,13067;PD3004,13107;PD3004,13147;PD3004,13187;PD3004,13227;PD3004,13267;PD3004,13307;PD3004,13347;PD3004,13387;PD3004,13427;PD3004,13467;PD3004,13507;PD3004,13547;PD3004,13587;PD3004,13627;PD3004,13667;PD3004,13707;PD3004,13747;PD3004,13787;PD3004,13827;PD3004,13867;PD3004,13907;PD3004,13947;PD3004,13987;PD3004,14027;PD3004,14067;PD3004,14107;PD3004,14147;PD3004,14187;PD3004,14227;PD3004,14267;PD3004,14307;PD3004,14347;PD3004,14387;PD3004,14427;PD3004,14467;PD3004,14507;PD3004,14547;PD3004,14587;PD3004,14627;PD3004,14667;PD3004,14707;PD3004,14747;PD3004,14787;PD3004,14827;PD3004,14867;PD3004,14907;PD3004,14947;PD3004,14987;PD3004,15027;PD3004,15067;PD3004,15107;PD3004,15124;PU0,18528;SP0;EC0;EC1;OE; diff --git a/seance/tests/snapshots/snapshot_tests__rectangle PCL output.snap b/seance/tests/snapshots/snapshot_tests__rectangle PCL output.snap new file mode 100644 index 0000000..46df60c --- /dev/null +++ b/seance/tests/snapshots/snapshot_tests__rectangle PCL output.snap @@ -0,0 +1,5 @@ +--- +source: seance/tests/snapshot_tests.rs +expression: "&pcl" +--- +%-12345XE!m9Nrectangle!v16R1111111111111111!v64I0400040004000400040004000400040004000400040004000400040004000400!v64V0020002000200020002000200020002000200020002000200020002000200020!v64P0100010001000100010001000100010001000100010001000100010001000100!v16D*t508R&u508R!r0N%1A!r1000I!r1000K!r500P*t508R&u508R!m0S!s1S%1BIN;SC;PU;SP1;LT;PU0,18528;SP1;PU3004,15124;PD3004,15124;PD3044,15124;PD3084,15124;PD3124,15124;PD3164,15124;PD3204,15124;PD3244,15124;PD3284,15124;PD3324,15124;PD3364,15124;PD3404,15124;PD3444,15124;PD3484,15124;PD3524,15124;PD3564,15124;PD3604,15124;PD3644,15124;PD3684,15124;PD3724,15124;PD3764,15124;PD3804,15124;PD3844,15124;PD3884,15124;PD3924,15124;PD3964,15124;PD4004,15124;PD4044,15124;PD4084,15124;PD4124,15124;PD4164,15124;PD4204,15124;PD4244,15124;PD4284,15124;PD4324,15124;PD4364,15124;PD4404,15124;PD4444,15124;PD4484,15124;PD4524,15124;PD4564,15124;PD4604,15124;PD4644,15124;PD4684,15124;PD4724,15124;PD4764,15124;PD4804,15124;PD4844,15124;PD4884,15124;PD4924,15124;PD4964,15124;PD5004,15124;PD5044,15124;PD5084,15124;PD5124,15124;PD5164,15124;PD5204,15124;PD5244,15124;PD5284,15124;PD5324,15124;PD5364,15124;PD5404,15124;PD5444,15124;PD5484,15124;PD5524,15124;PD5564,15124;PD5604,15124;PD5644,15124;PD5684,15124;PD5724,15124;PD5764,15124;PD5804,15124;PD5844,15124;PD5871,15111;PD5871,15071;PD5871,15031;PD5871,14991;PD5871,14951;PD5871,14911;PD5871,14871;PD5871,14831;PD5871,14791;PD5871,14751;PD5871,14711;PD5871,14671;PD5871,14631;PD5871,14591;PD5871,14551;PD5871,14511;PD5871,14471;PD5871,14431;PD5871,14391;PD5871,14351;PD5871,14311;PD5871,14271;PD5871,14231;PD5871,14191;PD5871,14151;PD5871,14111;PD5871,14071;PD5871,14031;PD5871,13991;PD5871,13951;PD5871,13911;PD5871,13871;PD5871,13831;PD5871,13791;PD5871,13751;PD5871,13711;PD5871,13671;PD5871,13631;PD5871,13591;PD5871,13551;PD5871,13511;PD5871,13471;PD5871,13431;PD5871,13391;PD5871,13351;PD5871,13311;PD5871,13271;PD5871,13231;PD5871,13191;PD5871,13151;PD5871,13111;PD5871,13071;PD5871,13031;PD5871,12991;PD5871,12951;PD5871,12911;PD5871,12871;PD5871,12831;PD5871,12791;PD5871,12751;PD5871,12711;PD5871,12671;PD5871,12631;PD5871,12591;PD5871,12551;PD5871,12511;PD5871,12471;PD5871,12431;PD5871,12391;PD5871,12351;PD5871,12311;PD5871,12271;PD5871,12231;PD5871,12191;PD5871,12151;PD5839,12143;PD5799,12143;PD5759,12143;PD5719,12143;PD5679,12143;PD5639,12143;PD5599,12143;PD5559,12143;PD5519,12143;PD5479,12143;PD5439,12143;PD5399,12143;PD5359,12143;PD5319,12143;PD5279,12143;PD5239,12143;PD5199,12143;PD5159,12143;PD5119,12143;PD5079,12143;PD5039,12143;PD4999,12143;PD4959,12143;PD4919,12143;PD4879,12143;PD4839,12143;PD4799,12143;PD4759,12143;PD4719,12143;PD4679,12143;PD4639,12143;PD4599,12143;PD4559,12143;PD4519,12143;PD4479,12143;PD4439,12143;PD4399,12143;PD4359,12143;PD4319,12143;PD4279,12143;PD4239,12143;PD4199,12143;PD4159,12143;PD4119,12143;PD4079,12143;PD4039,12143;PD3999,12143;PD3959,12143;PD3919,12143;PD3879,12143;PD3839,12143;PD3799,12143;PD3759,12143;PD3719,12143;PD3679,12143;PD3639,12143;PD3599,12143;PD3559,12143;PD3519,12143;PD3479,12143;PD3439,12143;PD3399,12143;PD3359,12143;PD3319,12143;PD3279,12143;PD3239,12143;PD3199,12143;PD3159,12143;PD3119,12143;PD3079,12143;PD3039,12143;PD3004,12147;PD3004,12187;PD3004,12227;PD3004,12267;PD3004,12307;PD3004,12347;PD3004,12387;PD3004,12427;PD3004,12467;PD3004,12507;PD3004,12547;PD3004,12587;PD3004,12627;PD3004,12667;PD3004,12707;PD3004,12747;PD3004,12787;PD3004,12827;PD3004,12867;PD3004,12907;PD3004,12947;PD3004,12987;PD3004,13027;PD3004,13067;PD3004,13107;PD3004,13147;PD3004,13187;PD3004,13227;PD3004,13267;PD3004,13307;PD3004,13347;PD3004,13387;PD3004,13427;PD3004,13467;PD3004,13507;PD3004,13547;PD3004,13587;PD3004,13627;PD3004,13667;PD3004,13707;PD3004,13747;PD3004,13787;PD3004,13827;PD3004,13867;PD3004,13907;PD3004,13947;PD3004,13987;PD3004,14027;PD3004,14067;PD3004,14107;PD3004,14147;PD3004,14187;PD3004,14227;PD3004,14267;PD3004,14307;PD3004,14347;PD3004,14387;PD3004,14427;PD3004,14467;PD3004,14507;PD3004,14547;PD3004,14587;PD3004,14627;PD3004,14667;PD3004,14707;PD3004,14747;PD3004,14787;PD3004,14827;PD3004,14867;PD3004,14907;PD3004,14947;PD3004,14987;PD3004,15027;PD3004,15067;PD3004,15107;PD3004,15124;PU0,18528;SP0;EC0;EC1;OE;%1AE%-12345X diff --git a/seance/tests/snapshots/snapshot_tests__rectangle plotted paths.snap b/seance/tests/snapshots/snapshot_tests__rectangle plotted paths.snap new file mode 100644 index 0000000..0bef41c --- /dev/null +++ b/seance/tests/snapshots/snapshot_tests__rectangle plotted paths.snap @@ -0,0 +1,1192 @@ +--- +source: seance/tests/snapshot_tests.rs +expression: "&resolved_paths" +--- +{ + PathColour( + [ + 0, + 0, + 0, + ], + ): [ + [ + ResolvedPoint { + x: 3004, + y: 15124, + }, + ResolvedPoint { + x: 3044, + y: 15124, + }, + ResolvedPoint { + x: 3084, + y: 15124, + }, + ResolvedPoint { + x: 3124, + y: 15124, + }, + ResolvedPoint { + x: 3164, + y: 15124, + }, + ResolvedPoint { + x: 3204, + y: 15124, + }, + ResolvedPoint { + x: 3244, + y: 15124, + }, + ResolvedPoint { + x: 3284, + y: 15124, + }, + ResolvedPoint { + x: 3324, + y: 15124, + }, + ResolvedPoint { + x: 3364, + y: 15124, + }, + ResolvedPoint { + x: 3404, + y: 15124, + }, + ResolvedPoint { + x: 3444, + y: 15124, + }, + ResolvedPoint { + x: 3484, + y: 15124, + }, + ResolvedPoint { + x: 3524, + y: 15124, + }, + ResolvedPoint { + x: 3564, + y: 15124, + }, + ResolvedPoint { + x: 3604, + y: 15124, + }, + ResolvedPoint { + x: 3644, + y: 15124, + }, + ResolvedPoint { + x: 3684, + y: 15124, + }, + ResolvedPoint { + x: 3724, + y: 15124, + }, + ResolvedPoint { + x: 3764, + y: 15124, + }, + ResolvedPoint { + x: 3804, + y: 15124, + }, + ResolvedPoint { + x: 3844, + y: 15124, + }, + ResolvedPoint { + x: 3884, + y: 15124, + }, + ResolvedPoint { + x: 3924, + y: 15124, + }, + ResolvedPoint { + x: 3964, + y: 15124, + }, + ResolvedPoint { + x: 4004, + y: 15124, + }, + ResolvedPoint { + x: 4044, + y: 15124, + }, + ResolvedPoint { + x: 4084, + y: 15124, + }, + ResolvedPoint { + x: 4124, + y: 15124, + }, + ResolvedPoint { + x: 4164, + y: 15124, + }, + ResolvedPoint { + x: 4204, + y: 15124, + }, + ResolvedPoint { + x: 4244, + y: 15124, + }, + ResolvedPoint { + x: 4284, + y: 15124, + }, + ResolvedPoint { + x: 4324, + y: 15124, + }, + ResolvedPoint { + x: 4364, + y: 15124, + }, + ResolvedPoint { + x: 4404, + y: 15124, + }, + ResolvedPoint { + x: 4444, + y: 15124, + }, + ResolvedPoint { + x: 4484, + y: 15124, + }, + ResolvedPoint { + x: 4524, + y: 15124, + }, + ResolvedPoint { + x: 4564, + y: 15124, + }, + ResolvedPoint { + x: 4604, + y: 15124, + }, + ResolvedPoint { + x: 4644, + y: 15124, + }, + ResolvedPoint { + x: 4684, + y: 15124, + }, + ResolvedPoint { + x: 4724, + y: 15124, + }, + ResolvedPoint { + x: 4764, + y: 15124, + }, + ResolvedPoint { + x: 4804, + y: 15124, + }, + ResolvedPoint { + x: 4844, + y: 15124, + }, + ResolvedPoint { + x: 4884, + y: 15124, + }, + ResolvedPoint { + x: 4924, + y: 15124, + }, + ResolvedPoint { + x: 4964, + y: 15124, + }, + ResolvedPoint { + x: 5004, + y: 15124, + }, + ResolvedPoint { + x: 5044, + y: 15124, + }, + ResolvedPoint { + x: 5084, + y: 15124, + }, + ResolvedPoint { + x: 5124, + y: 15124, + }, + ResolvedPoint { + x: 5164, + y: 15124, + }, + ResolvedPoint { + x: 5204, + y: 15124, + }, + ResolvedPoint { + x: 5244, + y: 15124, + }, + ResolvedPoint { + x: 5284, + y: 15124, + }, + ResolvedPoint { + x: 5324, + y: 15124, + }, + ResolvedPoint { + x: 5364, + y: 15124, + }, + ResolvedPoint { + x: 5404, + y: 15124, + }, + ResolvedPoint { + x: 5444, + y: 15124, + }, + ResolvedPoint { + x: 5484, + y: 15124, + }, + ResolvedPoint { + x: 5524, + y: 15124, + }, + ResolvedPoint { + x: 5564, + y: 15124, + }, + ResolvedPoint { + x: 5604, + y: 15124, + }, + ResolvedPoint { + x: 5644, + y: 15124, + }, + ResolvedPoint { + x: 5684, + y: 15124, + }, + ResolvedPoint { + x: 5724, + y: 15124, + }, + ResolvedPoint { + x: 5764, + y: 15124, + }, + ResolvedPoint { + x: 5804, + y: 15124, + }, + ResolvedPoint { + x: 5844, + y: 15124, + }, + ResolvedPoint { + x: 5871, + y: 15111, + }, + ResolvedPoint { + x: 5871, + y: 15071, + }, + ResolvedPoint { + x: 5871, + y: 15031, + }, + ResolvedPoint { + x: 5871, + y: 14991, + }, + ResolvedPoint { + x: 5871, + y: 14951, + }, + ResolvedPoint { + x: 5871, + y: 14911, + }, + ResolvedPoint { + x: 5871, + y: 14871, + }, + ResolvedPoint { + x: 5871, + y: 14831, + }, + ResolvedPoint { + x: 5871, + y: 14791, + }, + ResolvedPoint { + x: 5871, + y: 14751, + }, + ResolvedPoint { + x: 5871, + y: 14711, + }, + ResolvedPoint { + x: 5871, + y: 14671, + }, + ResolvedPoint { + x: 5871, + y: 14631, + }, + ResolvedPoint { + x: 5871, + y: 14591, + }, + ResolvedPoint { + x: 5871, + y: 14551, + }, + ResolvedPoint { + x: 5871, + y: 14511, + }, + ResolvedPoint { + x: 5871, + y: 14471, + }, + ResolvedPoint { + x: 5871, + y: 14431, + }, + ResolvedPoint { + x: 5871, + y: 14391, + }, + ResolvedPoint { + x: 5871, + y: 14351, + }, + ResolvedPoint { + x: 5871, + y: 14311, + }, + ResolvedPoint { + x: 5871, + y: 14271, + }, + ResolvedPoint { + x: 5871, + y: 14231, + }, + ResolvedPoint { + x: 5871, + y: 14191, + }, + ResolvedPoint { + x: 5871, + y: 14151, + }, + ResolvedPoint { + x: 5871, + y: 14111, + }, + ResolvedPoint { + x: 5871, + y: 14071, + }, + ResolvedPoint { + x: 5871, + y: 14031, + }, + ResolvedPoint { + x: 5871, + y: 13991, + }, + ResolvedPoint { + x: 5871, + y: 13951, + }, + ResolvedPoint { + x: 5871, + y: 13911, + }, + ResolvedPoint { + x: 5871, + y: 13871, + }, + ResolvedPoint { + x: 5871, + y: 13831, + }, + ResolvedPoint { + x: 5871, + y: 13791, + }, + ResolvedPoint { + x: 5871, + y: 13751, + }, + ResolvedPoint { + x: 5871, + y: 13711, + }, + ResolvedPoint { + x: 5871, + y: 13671, + }, + ResolvedPoint { + x: 5871, + y: 13631, + }, + ResolvedPoint { + x: 5871, + y: 13591, + }, + ResolvedPoint { + x: 5871, + y: 13551, + }, + ResolvedPoint { + x: 5871, + y: 13511, + }, + ResolvedPoint { + x: 5871, + y: 13471, + }, + ResolvedPoint { + x: 5871, + y: 13431, + }, + ResolvedPoint { + x: 5871, + y: 13391, + }, + ResolvedPoint { + x: 5871, + y: 13351, + }, + ResolvedPoint { + x: 5871, + y: 13311, + }, + ResolvedPoint { + x: 5871, + y: 13271, + }, + ResolvedPoint { + x: 5871, + y: 13231, + }, + ResolvedPoint { + x: 5871, + y: 13191, + }, + ResolvedPoint { + x: 5871, + y: 13151, + }, + ResolvedPoint { + x: 5871, + y: 13111, + }, + ResolvedPoint { + x: 5871, + y: 13071, + }, + ResolvedPoint { + x: 5871, + y: 13031, + }, + ResolvedPoint { + x: 5871, + y: 12991, + }, + ResolvedPoint { + x: 5871, + y: 12951, + }, + ResolvedPoint { + x: 5871, + y: 12911, + }, + ResolvedPoint { + x: 5871, + y: 12871, + }, + ResolvedPoint { + x: 5871, + y: 12831, + }, + ResolvedPoint { + x: 5871, + y: 12791, + }, + ResolvedPoint { + x: 5871, + y: 12751, + }, + ResolvedPoint { + x: 5871, + y: 12711, + }, + ResolvedPoint { + x: 5871, + y: 12671, + }, + ResolvedPoint { + x: 5871, + y: 12631, + }, + ResolvedPoint { + x: 5871, + y: 12591, + }, + ResolvedPoint { + x: 5871, + y: 12551, + }, + ResolvedPoint { + x: 5871, + y: 12511, + }, + ResolvedPoint { + x: 5871, + y: 12471, + }, + ResolvedPoint { + x: 5871, + y: 12431, + }, + ResolvedPoint { + x: 5871, + y: 12391, + }, + ResolvedPoint { + x: 5871, + y: 12351, + }, + ResolvedPoint { + x: 5871, + y: 12311, + }, + ResolvedPoint { + x: 5871, + y: 12271, + }, + ResolvedPoint { + x: 5871, + y: 12231, + }, + ResolvedPoint { + x: 5871, + y: 12191, + }, + ResolvedPoint { + x: 5871, + y: 12151, + }, + ResolvedPoint { + x: 5839, + y: 12143, + }, + ResolvedPoint { + x: 5799, + y: 12143, + }, + ResolvedPoint { + x: 5759, + y: 12143, + }, + ResolvedPoint { + x: 5719, + y: 12143, + }, + ResolvedPoint { + x: 5679, + y: 12143, + }, + ResolvedPoint { + x: 5639, + y: 12143, + }, + ResolvedPoint { + x: 5599, + y: 12143, + }, + ResolvedPoint { + x: 5559, + y: 12143, + }, + ResolvedPoint { + x: 5519, + y: 12143, + }, + ResolvedPoint { + x: 5479, + y: 12143, + }, + ResolvedPoint { + x: 5439, + y: 12143, + }, + ResolvedPoint { + x: 5399, + y: 12143, + }, + ResolvedPoint { + x: 5359, + y: 12143, + }, + ResolvedPoint { + x: 5319, + y: 12143, + }, + ResolvedPoint { + x: 5279, + y: 12143, + }, + ResolvedPoint { + x: 5239, + y: 12143, + }, + ResolvedPoint { + x: 5199, + y: 12143, + }, + ResolvedPoint { + x: 5159, + y: 12143, + }, + ResolvedPoint { + x: 5119, + y: 12143, + }, + ResolvedPoint { + x: 5079, + y: 12143, + }, + ResolvedPoint { + x: 5039, + y: 12143, + }, + ResolvedPoint { + x: 4999, + y: 12143, + }, + ResolvedPoint { + x: 4959, + y: 12143, + }, + ResolvedPoint { + x: 4919, + y: 12143, + }, + ResolvedPoint { + x: 4879, + y: 12143, + }, + ResolvedPoint { + x: 4839, + y: 12143, + }, + ResolvedPoint { + x: 4799, + y: 12143, + }, + ResolvedPoint { + x: 4759, + y: 12143, + }, + ResolvedPoint { + x: 4719, + y: 12143, + }, + ResolvedPoint { + x: 4679, + y: 12143, + }, + ResolvedPoint { + x: 4639, + y: 12143, + }, + ResolvedPoint { + x: 4599, + y: 12143, + }, + ResolvedPoint { + x: 4559, + y: 12143, + }, + ResolvedPoint { + x: 4519, + y: 12143, + }, + ResolvedPoint { + x: 4479, + y: 12143, + }, + ResolvedPoint { + x: 4439, + y: 12143, + }, + ResolvedPoint { + x: 4399, + y: 12143, + }, + ResolvedPoint { + x: 4359, + y: 12143, + }, + ResolvedPoint { + x: 4319, + y: 12143, + }, + ResolvedPoint { + x: 4279, + y: 12143, + }, + ResolvedPoint { + x: 4239, + y: 12143, + }, + ResolvedPoint { + x: 4199, + y: 12143, + }, + ResolvedPoint { + x: 4159, + y: 12143, + }, + ResolvedPoint { + x: 4119, + y: 12143, + }, + ResolvedPoint { + x: 4079, + y: 12143, + }, + ResolvedPoint { + x: 4039, + y: 12143, + }, + ResolvedPoint { + x: 3999, + y: 12143, + }, + ResolvedPoint { + x: 3959, + y: 12143, + }, + ResolvedPoint { + x: 3919, + y: 12143, + }, + ResolvedPoint { + x: 3879, + y: 12143, + }, + ResolvedPoint { + x: 3839, + y: 12143, + }, + ResolvedPoint { + x: 3799, + y: 12143, + }, + ResolvedPoint { + x: 3759, + y: 12143, + }, + ResolvedPoint { + x: 3719, + y: 12143, + }, + ResolvedPoint { + x: 3679, + y: 12143, + }, + ResolvedPoint { + x: 3639, + y: 12143, + }, + ResolvedPoint { + x: 3599, + y: 12143, + }, + ResolvedPoint { + x: 3559, + y: 12143, + }, + ResolvedPoint { + x: 3519, + y: 12143, + }, + ResolvedPoint { + x: 3479, + y: 12143, + }, + ResolvedPoint { + x: 3439, + y: 12143, + }, + ResolvedPoint { + x: 3399, + y: 12143, + }, + ResolvedPoint { + x: 3359, + y: 12143, + }, + ResolvedPoint { + x: 3319, + y: 12143, + }, + ResolvedPoint { + x: 3279, + y: 12143, + }, + ResolvedPoint { + x: 3239, + y: 12143, + }, + ResolvedPoint { + x: 3199, + y: 12143, + }, + ResolvedPoint { + x: 3159, + y: 12143, + }, + ResolvedPoint { + x: 3119, + y: 12143, + }, + ResolvedPoint { + x: 3079, + y: 12143, + }, + ResolvedPoint { + x: 3039, + y: 12143, + }, + ResolvedPoint { + x: 3004, + y: 12147, + }, + ResolvedPoint { + x: 3004, + y: 12187, + }, + ResolvedPoint { + x: 3004, + y: 12227, + }, + ResolvedPoint { + x: 3004, + y: 12267, + }, + ResolvedPoint { + x: 3004, + y: 12307, + }, + ResolvedPoint { + x: 3004, + y: 12347, + }, + ResolvedPoint { + x: 3004, + y: 12387, + }, + ResolvedPoint { + x: 3004, + y: 12427, + }, + ResolvedPoint { + x: 3004, + y: 12467, + }, + ResolvedPoint { + x: 3004, + y: 12507, + }, + ResolvedPoint { + x: 3004, + y: 12547, + }, + ResolvedPoint { + x: 3004, + y: 12587, + }, + ResolvedPoint { + x: 3004, + y: 12627, + }, + ResolvedPoint { + x: 3004, + y: 12667, + }, + ResolvedPoint { + x: 3004, + y: 12707, + }, + ResolvedPoint { + x: 3004, + y: 12747, + }, + ResolvedPoint { + x: 3004, + y: 12787, + }, + ResolvedPoint { + x: 3004, + y: 12827, + }, + ResolvedPoint { + x: 3004, + y: 12867, + }, + ResolvedPoint { + x: 3004, + y: 12907, + }, + ResolvedPoint { + x: 3004, + y: 12947, + }, + ResolvedPoint { + x: 3004, + y: 12987, + }, + ResolvedPoint { + x: 3004, + y: 13027, + }, + ResolvedPoint { + x: 3004, + y: 13067, + }, + ResolvedPoint { + x: 3004, + y: 13107, + }, + ResolvedPoint { + x: 3004, + y: 13147, + }, + ResolvedPoint { + x: 3004, + y: 13187, + }, + ResolvedPoint { + x: 3004, + y: 13227, + }, + ResolvedPoint { + x: 3004, + y: 13267, + }, + ResolvedPoint { + x: 3004, + y: 13307, + }, + ResolvedPoint { + x: 3004, + y: 13347, + }, + ResolvedPoint { + x: 3004, + y: 13387, + }, + ResolvedPoint { + x: 3004, + y: 13427, + }, + ResolvedPoint { + x: 3004, + y: 13467, + }, + ResolvedPoint { + x: 3004, + y: 13507, + }, + ResolvedPoint { + x: 3004, + y: 13547, + }, + ResolvedPoint { + x: 3004, + y: 13587, + }, + ResolvedPoint { + x: 3004, + y: 13627, + }, + ResolvedPoint { + x: 3004, + y: 13667, + }, + ResolvedPoint { + x: 3004, + y: 13707, + }, + ResolvedPoint { + x: 3004, + y: 13747, + }, + ResolvedPoint { + x: 3004, + y: 13787, + }, + ResolvedPoint { + x: 3004, + y: 13827, + }, + ResolvedPoint { + x: 3004, + y: 13867, + }, + ResolvedPoint { + x: 3004, + y: 13907, + }, + ResolvedPoint { + x: 3004, + y: 13947, + }, + ResolvedPoint { + x: 3004, + y: 13987, + }, + ResolvedPoint { + x: 3004, + y: 14027, + }, + ResolvedPoint { + x: 3004, + y: 14067, + }, + ResolvedPoint { + x: 3004, + y: 14107, + }, + ResolvedPoint { + x: 3004, + y: 14147, + }, + ResolvedPoint { + x: 3004, + y: 14187, + }, + ResolvedPoint { + x: 3004, + y: 14227, + }, + ResolvedPoint { + x: 3004, + y: 14267, + }, + ResolvedPoint { + x: 3004, + y: 14307, + }, + ResolvedPoint { + x: 3004, + y: 14347, + }, + ResolvedPoint { + x: 3004, + y: 14387, + }, + ResolvedPoint { + x: 3004, + y: 14427, + }, + ResolvedPoint { + x: 3004, + y: 14467, + }, + ResolvedPoint { + x: 3004, + y: 14507, + }, + ResolvedPoint { + x: 3004, + y: 14547, + }, + ResolvedPoint { + x: 3004, + y: 14587, + }, + ResolvedPoint { + x: 3004, + y: 14627, + }, + ResolvedPoint { + x: 3004, + y: 14667, + }, + ResolvedPoint { + x: 3004, + y: 14707, + }, + ResolvedPoint { + x: 3004, + y: 14747, + }, + ResolvedPoint { + x: 3004, + y: 14787, + }, + ResolvedPoint { + x: 3004, + y: 14827, + }, + ResolvedPoint { + x: 3004, + y: 14867, + }, + ResolvedPoint { + x: 3004, + y: 14907, + }, + ResolvedPoint { + x: 3004, + y: 14947, + }, + ResolvedPoint { + x: 3004, + y: 14987, + }, + ResolvedPoint { + x: 3004, + y: 15027, + }, + ResolvedPoint { + x: 3004, + y: 15067, + }, + ResolvedPoint { + x: 3004, + y: 15107, + }, + ResolvedPoint { + x: 3004, + y: 15124, + }, + ], + ], +}