@Test
  public void testOutsideTollTime() {
    Config config = matsimTestUtils.loadConfig(null);
    MutableScenario scenario = (MutableScenario) ScenarioUtils.createScenario(config);
    Fixture.createNetwork2(scenario);

    // a basic toll where only the morning hours are tolled
    RoadPricingSchemeImpl toll = new RoadPricingSchemeImpl();
    toll.setType("area");
    toll.addLink(Id.createLinkId("5"));
    toll.addLink(Id.createLinkId("11"));
    toll.addCost(8 * 3600, 10 * 3600, 1.0); // high costs!

    Fixture.createPopulation2(scenario);
    Population population = scenario.getPopulation();

    runOnAll(testee(scenario, toll), population);
    Id id1 = Id.createPersonId("1");
    LegImpl leg1 = getLeg1(population, id1);
    LegImpl leg2 = getLeg3(population, id1);

    Fixture.compareRoutes(
        "2 5 6",
        (NetworkRoute)
            leg1
                .getRoute()); // agent should take shortest route, as tolls are not active at that
                              // time
    Fixture.compareRoutes("8 11 12", (NetworkRoute) leg2.getRoute());
  }
  /** Tests a few cases where the router can decide if it is better to pay the toll or not. */
  @Test
  public void testBestAlternatives() {
    Config config = matsimTestUtils.loadConfig(null);
    MutableScenario scenario = (MutableScenario) ScenarioUtils.createScenario(config);
    Fixture.createNetwork2(scenario);

    // a basic toll where only the morning hours are tolled
    RoadPricingSchemeImpl toll = new RoadPricingSchemeImpl();
    toll.setType("area");
    toll.addLink(Id.createLinkId("5"));
    toll.addLink(Id.createLinkId("11"));
    Cost morningCost = toll.addCost(6 * 3600, 10 * 3600, 0.12);
    /* Start with a rather low toll. The toll is also so low, because we only
     * have small network with short links: the cost to travel across one link
     * is: 20s * (-6 EUR / h) = 20 * (-6) / 3600 = 0.03333
     */

    Fixture.createPopulation2(scenario);
    Population population = scenario.getPopulation();

    Id id1 = Id.createPersonId("1");

    // case 1: toll only in morning, it is cheaper to drive around
    runOnAll(testee(scenario, toll), population);
    Fixture.compareRoutes("2 3 4 6", (NetworkRoute) getLeg1(population, id1).getRoute());
    Fixture.compareRoutes("8 11 12", (NetworkRoute) getLeg3(population, id1).getRoute());

    // case 2: now add a toll in the afternoon too, so it is cheaper to pay the toll
    Cost afternoonCost = toll.addCost(14 * 3600, 18 * 3600, 0.12);
    runOnAll(testee(scenario, toll), population);
    Fixture.compareRoutes("2 5 6", (NetworkRoute) getLeg1(population, id1).getRoute());
    Fixture.compareRoutes("8 11 12", (NetworkRoute) getLeg3(population, id1).getRoute());

    // case 3: change the second leg to a non-car mode, than it should be the same as case 1
    String oldMode = getLeg3(population, id1).getMode();
    getLeg3(population, id1).setMode(TransportMode.pt);
    runOnAll(testee(scenario, toll), population);
    Fixture.compareRoutes("2 3 4 6", (NetworkRoute) getLeg1(population, id1).getRoute());
    // and change the mode back
    getLeg3(population, id1).setMode(oldMode);

    // case 4: now remove the costs and add them again, but with a higher amount
    toll.removeCost(morningCost);
    toll.removeCost(afternoonCost);
    toll.addCost(6 * 3600, 10 * 3600, 0.7);
    toll.addCost(14 * 3600, 18 * 3600, 0.7);
    // the agent should now decide to drive around
    runOnAll(testee(scenario, toll), population);
    Fixture.compareRoutes("2 3 4 6", (NetworkRoute) getLeg1(population, id1).getRoute());
  }
  /**
   * Tests cases where the agent must pay the toll because one of its activities is on a tolled link
   */
  @Test
  public void testTolledActLink() {
    Config config = matsimTestUtils.loadConfig(null);
    MutableScenario scenario = (MutableScenario) ScenarioUtils.createScenario(config);
    Fixture.createNetwork2(scenario);

    // a basic toll where only the morning hours are tolled
    RoadPricingSchemeImpl toll = new RoadPricingSchemeImpl();
    toll.setType("area");
    Id.createLinkId("7");
    toll.addCost(6 * 3600, 10 * 3600, 0.06);

    Fixture.createPopulation2(scenario);
    Population population = scenario.getPopulation();

    runOnAll(testee(scenario, toll), population);
    Id id1 = Id.createPersonId("1");

    Fixture.compareRoutes(
        "2 5 6",
        (NetworkRoute) getLeg1(population, id1).getRoute()); // agent should take shortest route
    Fixture.compareRoutes("8 11 12", (NetworkRoute) getLeg3(population, id1).getRoute());
  }