interactive-html-bom 0.2.0

Interactive HTML BOM Generator
Documentation
use interactive_html_bom::*;

#[test]
fn test_empty() {
  let bom = InteractiveHtmlBom::new(
    "Test Title",
    "Test Company",
    "Test Revision",
    "Test Date",
    (0.0, 0.0),
    (0.0, 0.0),
  );

  let html = bom.generate_html().unwrap();
  assert!(html.contains("<html"));
}

#[test]
fn test_everything() {
  let mut bom = InteractiveHtmlBom::new(
    "Test Title",
    "Test Company",
    "Test Revision",
    "Test Date",
    (0.0, 0.0),
    (100.0, 100.0),
  );

  bom.view_mode = ViewMode::TopBottom;
  bom.highlight_pin1 = HighlightPin1Mode::All;
  bom.dark_mode = true;
  bom.board_rotation = 45.0;
  bom.offset_back_rotation = true;
  bom.show_silkscreen = false;
  bom.show_fabrication = false;
  bom.show_pads = false;
  bom.checkboxes = vec!["Foo".into(), "Bar".into()];
  bom.fields = vec!["Field 1".into(), "Field 2".into()];
  bom.user_header = "<!-- header -->".into();
  bom.user_footer = "<!-- footer -->".into();
  bom.user_js = "<!-- js -->".into();

  bom.drawings.push(Drawing::new(
    DrawingKind::Polygon,
    DrawingLayer::Edge,
    "",
    0.1,
    false,
  ));
  bom.drawings.push(Drawing::new(
    DrawingKind::Polygon,
    DrawingLayer::SilkscreenFront,
    "M 0 0",
    0.1,
    false,
  ));
  bom.drawings.push(Drawing::new(
    DrawingKind::ReferenceText,
    DrawingLayer::SilkscreenBack,
    "",
    0.1,
    false,
  ));
  bom.drawings.push(Drawing::new(
    DrawingKind::Polygon,
    DrawingLayer::FabricationFront,
    "M 0 0",
    0.1,
    false,
  ));
  bom.drawings.push(Drawing::new(
    DrawingKind::ValueText,
    DrawingLayer::FabricationBack,
    "M 0 0",
    0.1,
    false,
  ));

  bom.tracks.push(Track::new(
    Layer::Front,
    (0.0, 0.0),
    (100.0, 100.0),
    1.0,
    None,
  ));
  bom.tracks.push(Track::new(
    Layer::Back,
    (0.0, 0.0),
    (100.0, 100.0),
    1.0,
    Some("net 1"),
  ));

  bom
    .vias
    .push(Via::new(&[Layer::Front], (50.0, 50.0), 1.0, 0.5, None));
  bom.vias.push(Via::new(
    &[Layer::Front, Layer::Back],
    (50.0, 50.0),
    1.0,
    0.5,
    Some("net 2"),
  ));

  bom.zones.push(Zone::new(Layer::Front, "M 0 0", None));
  bom
    .zones
    .push(Zone::new(Layer::Back, "M 0 0", Some("net 3")));

  bom.footprints.push(Footprint::new(
    Layer::Front,
    (50.0, 50.0),
    45.0,
    (-5.0, -5.0),
    (5.0, 5.0),
    &["Value 1".into(), "Value 2".into()],
    &[],
    false,
  ));
  bom.footprints.push(Footprint::new(
    Layer::Front,
    (50.0, 50.0),
    45.0,
    (-5.0, -5.0),
    (5.0, 5.0),
    &["Value 1".into(), "Value 2".into()],
    &[
      Pad::new(
        &[Layer::Front],
        (0.0, -5.0),
        45.0,
        "M 0 0",
        None,
        None,
        false,
      ),
      Pad::new(
        &[Layer::Front, Layer::Back],
        (0.0, 5.0),
        45.0,
        "M 0 0",
        Some((0.5, 1.0)),
        Some("net 4"),
        true,
      ),
    ],
    true,
  ));

  bom
    .bom_front
    .push(vec![RefMap::new("R1", 0), RefMap::new("R2", 1)]);
  bom
    .bom_back
    .push(vec![RefMap::new("R1", 0), RefMap::new("R2", 1)]);
  bom.bom_both.push(vec![RefMap::new("R1", 0)]);
  bom.bom_both.push(vec![RefMap::new("R2", 1)]);

  let html = bom.generate_html().unwrap();
  assert!(html.contains("<html"));
}

#[test]
fn test_invalid_footprint_id() {
  let mut bom = InteractiveHtmlBom::new(
    "Test Title",
    "Test Company",
    "Test Revision",
    "Test Date",
    (0.0, 0.0),
    (100.0, 100.0),
  );

  bom.bom_both.push(vec![RefMap::new("R1", 0)]);

  let err = bom.generate_html().unwrap_err();
  assert_eq!(err, "Invalid footprint ID.");
}

#[test]
fn test_inconsistent_fields() {
  let mut bom = InteractiveHtmlBom::new(
    "Test Title",
    "Test Company",
    "Test Revision",
    "Test Date",
    (0.0, 0.0),
    (100.0, 100.0),
  );

  bom.fields = vec!["Field 1".into()];

  bom.footprints.push(Footprint::new(
    Layer::Front,
    (50.0, 50.0),
    45.0,
    (-5.0, -5.0),
    (5.0, 5.0),
    &["Value 1".into(), "Value 2".into()],
    &[],
    false,
  ));

  let err = bom.generate_html().unwrap_err();
  assert_eq!(err, "Inconsistent number of fields.");
}