use femm_doc::FemmDoc; const FIXTURE: &str = r#"[Format] = 4.0 [Frequency] = 60 [Precision] = 1e-08 [MinAngle] = 30 [DoSmartMesh] = 1 [Depth] = 1 [LengthUnits] = millimeters [ProblemType] = planar [Coordinates] = cartesian [ACSolver] = 0 [PrevType] = 0 [PrevSoln] = "" [Comment] = "two-coil planar magnetics" [PointProps] = 1 = "A=0" = 0 = 0 = 0 = 0 [BdryProps] = 1 = "outer" = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 [BlockProps] = 2 = "Air" = 1 = 1 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 1 = 0 = 0 = 0 = "Copper" = 1 = 1 = 0 = 0 = 0 = 0 = 58 = 0 = 0 = 0 = 0 = 0 = 1 = 0 = 0 = 0 [CircuitProps] = 1 = "Coil" = 100 = 0 = 1 [NumPoints] = 4 0 0 1 0 10 0 0 0 10 10 0 0 0 10 0 0 [NumSegments] = 4 0 1 -1 1 0 0 1 2 -1 1 0 0 2 3 -1 1 0 0 3 0 -1 1 0 0 [NumArcSegments] = 0 [NumHoles] = 0 [NumBlockLabels] = 1 5 5 2 0.1 1 0 0 100 0 "#; #[test] fn parses_fixture_geometry() { let doc = FemmDoc::parse(FIXTURE).expect("parse"); assert_eq!(doc.frequency, 60.0); assert_eq!(doc.nodes.len(), 4); assert_eq!(doc.segments.len(), 4); assert_eq!(doc.arcs.len(), 0); assert_eq!(doc.block_labels.len(), 1); assert_eq!(doc.materials.len(), 2); assert_eq!(doc.boundaries.len(), 1); assert_eq!(doc.points.len(), 1); assert_eq!(doc.circuits.len(), 1); assert_eq!(doc.nodes[0].boundary_marker, "A=0"); assert_eq!(doc.segments[0].boundary_marker, "outer"); assert_eq!(doc.block_labels[0].block_type, "Copper"); assert_eq!(doc.block_labels[0].in_circuit, "Coil"); } #[test] fn round_trips_parse_write_parse() { let a = FemmDoc::parse(FIXTURE).expect("parse a"); let text = a.write(); let b = FemmDoc::parse(&text).expect("parse b"); assert_eq!(a.frequency, b.frequency); assert_eq!(a.precision, b.precision); assert_eq!(a.depth, b.depth); assert_eq!(a.nodes.len(), b.nodes.len()); assert_eq!(a.segments.len(), b.segments.len()); assert_eq!(a.materials.len(), b.materials.len()); for (x, y) in a.nodes.iter().zip(b.nodes.iter()) { assert!((x.x - y.x).abs() < 1e-12); assert!((x.y - y.y).abs() < 1e-12); assert_eq!(x.boundary_marker, y.boundary_marker); } for (x, y) in a.segments.iter().zip(b.segments.iter()) { assert_eq!(x.n0, y.n0); assert_eq!(x.n1, y.n1); assert_eq!(x.boundary_marker, y.boundary_marker); } for (x, y) in a.materials.iter().zip(b.materials.iter()) { assert_eq!(x.name, y.name); assert!((x.mu_x - y.mu_x).abs() < 1e-12); assert!((x.cduct - y.cduct).abs() < 1e-12); } assert_eq!(a.block_labels.len(), b.block_labels.len()); let la = &a.block_labels[0]; let lb = &b.block_labels[0]; assert!((la.x - lb.x).abs() < 1e-12); assert_eq!(la.block_type, lb.block_type); assert_eq!(la.in_circuit, lb.in_circuit); assert_eq!(la.turns, lb.turns); assert!((la.max_area - lb.max_area).abs() < 1e-10); }