@Test
  public void testStep() throws Exception {

    Blueprint b =
        Blueprint.simpleBlueprint(
            DifferentiatedGoodType.CAPITAL, 1, DifferentiatedGoodType.CAPITAL, 1);
    MacroII localMacroII = new MacroII(1);
    localMacroII.schedule =
        mock(Schedule.class); // put in a fake schedule so we avoid steppables firing at random

    Firm f = new Firm(localMacroII);
    Plant localCRS = new Plant(b, new Firm(localMacroII));
    localCRS.setPlantMachinery(
        new CRSExponentialMachinery(DifferentiatedGoodType.CAPITAL, f, 0, localCRS, 1f, 1f));
    f.addPlant(localCRS);

    SalesDepartmentAllAtOnce stub = mock(SalesDepartmentAllAtOnce.class);
    when(stub.isSelling(any(Good.class))).thenReturn(Boolean.TRUE);
    localCRS.getOwner().registerSaleDepartment(stub, DifferentiatedGoodType.CAPITAL); // fake sales
    // department so that you don't try selling the stuff you build

    localCRS.setCostStrategy(new EmptyCostStrategy());
    try {
      localCRS.getModel();

      localCRS.getModel().getPhaseScheduler().step(localCRS.getModel());

      assertEquals(localCRS.getStatus(), PlantStatus.WAITING_FOR_WORKERS);
      localCRS.addWorker(new Person(localCRS.getModel()));
      localCRS.addWorker(new Person(localCRS.getModel()));

      localCRS.getModel().getPhaseScheduler().step(localCRS.getModel());

      assertEquals(localCRS.getStatus(), PlantStatus.WAITING_FOR_INPUT);
      localCRS
          .getOwner()
          .receive(
              Good.getInstanceOfDifferentiatedGood(
                  DifferentiatedGoodType.CAPITAL, drs.getOwner(), 1),
              drs.getOwner());

      localCRS.getModel().getPhaseScheduler().step(localCRS.getModel());
      assertEquals(
          localCRS.getStatus(), PlantStatus.READY); // you should automatically start production!

    } catch (Exception e) {
      fail("Can't throw exceptions now");
    }
  }
  @Before
  public void setUp() throws Exception {

    Blueprint b =
        new Blueprint.Builder()
            .output(DifferentiatedGoodType.CAPITAL, 2)
            .build(); // create a simple output
    macro = new MacroII(1);
    macro.schedule =
        mock(Schedule.class); // put in a fake schedule so we avoid steppables firing at random

    Firm f = new Firm(macro);
    crs = new Plant(b, new Firm(macro));
    crs.setPlantMachinery(
        new CRSExponentialMachinery(DifferentiatedGoodType.CAPITAL, f, 0, crs, 1f, 1f));
    irs = new Plant(b, new Firm(macro));
    irs.setPlantMachinery(
        new IRSExponentialMachinery(DifferentiatedGoodType.CAPITAL, f, 0, irs, 1f, 1f));
    drs = new Plant(b, new Firm(macro));
    drs.setPlantMachinery(
        new DRSExponentialMachinery(DifferentiatedGoodType.CAPITAL, f, 0, drs, 1f, 1f));

    Person w1 = new Person(macro);
    Person w2 = new Person(macro);
    crs.addWorker(w1);
    crs.addWorker(w2);
    w1.hired(crs.getOwner(), 9999999);
    w2.hired(crs.getOwner(), 9999999);
    w1 = new Person(macro);
    w2 = new Person(macro);
    irs.addWorker(w1);
    irs.addWorker(w2);
    w1.hired(crs.getOwner(), 9999999);
    w2.hired(crs.getOwner(), 9999999);
    w1 = new Person(macro);
    w2 = new Person(macro);
    drs.addWorker(w1);
    drs.addWorker(w2);
    w1.hired(crs.getOwner(), 9999999);
    w2.hired(crs.getOwner(), 9999999);

    SalesDepartmentAllAtOnce stub = mock(SalesDepartmentAllAtOnce.class);
    crs.getOwner()
        .registerSaleDepartment(
            stub,
            DifferentiatedGoodType
                .CAPITAL); // fake sales department so that you don't sell the stuff you
                           // completeProductionRunNow
    irs.getOwner()
        .registerSaleDepartment(
            stub,
            DifferentiatedGoodType
                .CAPITAL); // fake sales department so that you don't sell the stuff you
                           // completeProductionRunNow
    drs.getOwner()
        .registerSaleDepartment(
            stub,
            DifferentiatedGoodType
                .CAPITAL); // fake sales department so that you don't sell the stuff you
                           // completeProductionRunNow
    when(stub.isSelling(any(Good.class))).thenReturn(Boolean.TRUE);

    crs.setCostStrategy(new EmptyCostStrategy());
    irs.setCostStrategy(new EmptyCostStrategy());
    drs.setCostStrategy(new EmptyCostStrategy());
  }