Follow the Brass

spec/follow_the_brass_spec.rb

51 lines · ruby

Project files
# frozen_string_literal: true

require "caliber_specification"
require "cartridge_case"
require "case_classifier"
require "foreign_object"
require "production_readiness_gate"

RSpec.describe "Follow the brass" do
  it "moves a mixed batch through classification and readiness without merging exits" do
    ready_case = cartridge_case
    unsized_case = cartridge_case(sized: false)
    nine_millimeter = CartridgeCase.new(caliber: "9mm")
    fifty_caliber = CartridgeCase.new(caliber: ".50 cal")
    stripper_clip = ForeignObject.new(description: "stripper clip")
    cleaning_output = [
      ready_case, unsized_case, nine_millimeter, fifty_caliber, stripper_clip
    ]

    classification = classifier.classify(cleaning_output)
    admissions = classification.accepted.to_h { |item| [item, gate.assess(item)] }

    expect(admissions.select { |_item, result| result.admitted? }.keys).to eq([ready_case])
    expect(admissions.fetch(unsized_case).reasons).to eq([:unsized])
    expect(classification.wrong_context).to eq([nine_millimeter, fifty_caliber])
    expect(classification.foreign).to eq([stripper_clip])
  end

  def classifier
    CaseClassifier.new(expected_caliber: "5.56")
  end

  def gate
    ProductionReadinessGate.new(caliber_specification: specification)
  end

  def specification
    CaliberSpecification.new(caliber: "5.56", maximum_case_length: 1.760)
  end

  def cartridge_case(overrides = {})
    CartridgeCase.new(**readiness_facts.merge(overrides))
  end

  def readiness_facts
    {
      caliber: "5.56", clean: true, primer_pocket_clear: true,
      primer_pocket_prepared: true, sized: true, length: 1.750, defects: []
    }
  end
end

Read along in the manual: The Reloading Lab · Download the project (zip)