func verifyPosition(t *testing.T, s *state.State, match []string, scCollector map[dip.Province]dip.Nation, unitCollector, dislodgedCollector map[dip.Province]dip.Unit, fails *int) { if match[2] == "supply" { if nation, _, ok := s.SupplyCenter(dip.Province(match[3])); ok && nation == dip.Nation(match[1]) { scCollector[dip.Province(match[3])] = nation } else { t.Errorf("%v: Expected %v to own SC in %v, but found %v, %v", s.Phase(), match[1], match[3], nation, ok) *fails += 1 } } else if match[2] == "army" { if unit, _, ok := s.Unit(dip.Province(match[3])); ok && unit.Nation == dip.Nation(match[1]) && unit.Type == cla.Army { unitCollector[dip.Province(match[3])] = unit } else { t.Errorf("%v: Expected to find %v %v in %v, but found %v, %v", s.Phase(), match[1], cla.Army, match[3], unit, ok) *fails += 1 } } else if match[2] == "fleet" { if unit, _, ok := s.Unit(dip.Province(match[3])); ok && unit.Nation == dip.Nation(match[1]) && unit.Type == cla.Fleet { unitCollector[dip.Province(match[3])] = unit } else { t.Errorf("%v: Expected to find %v %v in %v, but found %v, %v", s.Phase(), match[1], cla.Fleet, match[3], unit, ok) *fails += 1 } } else if match[2] == "fleet/dislodged" { if unit, _, ok := s.Dislodged(dip.Province(match[3])); ok && unit.Nation == dip.Nation(match[1]) && unit.Type == cla.Fleet { dislodgedCollector[dip.Province(match[3])] = unit } else { t.Errorf("%v: Expected to find %v %v dislodged in %v, but found %v, %v", s.Phase(), match[1], cla.Army, match[3], unit, ok) *fails += 1 } } else if match[2] == "army/dislodged" { if unit, _, ok := s.Dislodged(dip.Province(match[3])); ok && unit.Nation == dip.Nation(match[1]) && unit.Type == cla.Army { dislodgedCollector[dip.Province(match[3])] = unit } else { t.Errorf("%v: Expected to find %v %v dislodged in %v, but found %v, %v", s.Phase(), match[1], cla.Army, match[3], unit, ok) *fails += 1 } } else { t.Fatalf("Unknown position description %v", match) } }
func testDATC(t *testing.T, statePair *datc.StatePair) { var s *state.State if statePair.Before.Phase == nil { s = Blank(&phase{ year: 1901, season: cla.Spring, typ: cla.Movement, }) } else { s = Blank(statePair.Before.Phase) } s.SetUnits(statePair.Before.Units) s.SetDislodgeds(statePair.Before.Dislodgeds) s.SetSupplyCenters(statePair.Before.SCs) for prov, order := range statePair.Before.Orders { if s.Phase().Type() == cla.Movement { if u, _, ok := s.Unit(prov); ok && u.Nation == order.Nation { s.SetOrder(prov, order.Order) } } else if s.Phase().Type() == cla.Retreat { if u, _, ok := s.Dislodged(prov); ok && u.Nation == order.Nation { s.SetOrder(prov, order.Order) } } else if s.Phase().Type() == cla.Adjustment { if order.Order.Type() == cla.Build { if n, _, ok := s.SupplyCenter(prov); ok && n == order.Nation { s.SetOrder(prov, order.Order) } } else if order.Order.Type() == cla.Disband { if u, _, ok := s.Unit(prov); ok && u.Nation == order.Nation { s.SetOrder(prov, order.Order) } } } else { t.Fatalf("Unsupported phase type %v", s.Phase().Type()) } } for _, order := range statePair.Before.FailedOrders { if order.Order.Type() == cla.Move && !order.Order.Flags()[cla.ViaConvoy] { s.AddBounce(order.Order.Targets()[0], order.Order.Targets()[1]) } } for _, order := range statePair.Before.SuccessfulOrders { if order.Order.Type() == cla.Move && !order.Order.Flags()[cla.ViaConvoy] { s.SetDislodger(order.Order.Targets()[0], order.Order.Targets()[1]) } } s.Next() err := false for prov, unit := range statePair.After.Units { if found, ok := s.Units()[prov]; ok { if !found.Equal(unit) { err = true t.Errorf("%v: Expected %v in %v, but found %v", statePair.Case, unit, prov, found) } } else { err = true t.Errorf("%v: Expected %v in %v, but found nothing", statePair.Case, unit, prov) } } for prov, unit := range statePair.After.Dislodgeds { if found, ok := s.Dislodgeds()[prov]; ok { if !found.Equal(unit) { err = true t.Errorf("%v: Expected %v dislodged in %v, but found %v", statePair.Case, unit, prov, found) } } else { err = true t.Errorf("%v: Expected %v dislodged in %v, but found nothing", statePair.Case, unit, prov) } } for prov, unit := range s.Units() { if _, ok := statePair.After.Units[prov]; !ok { err = true t.Errorf("%v: Expected %v to be empty, but found %v", statePair.Case, prov, unit) } } for prov, unit := range s.Dislodgeds() { if _, ok := statePair.After.Dislodgeds[prov]; !ok { err = true t.Errorf("%v: Expected %v to be empty of dislodged units, but found %v", statePair.Case, prov, unit) } } if err { dip.DumpLog() t.Errorf("%v: ### Units:", statePair.Case) for prov, unit := range statePair.Before.Units { t.Errorf("%v: %v %v", statePair.Case, prov, unit) } t.Errorf("%v: ### Dislodged before:", statePair.Case) for prov, disl := range statePair.Before.Dislodgeds { t.Errorf("%v: %v %v", statePair.Case, prov, disl) } t.Errorf("%v: ### Orders:", statePair.Case) for _, order := range statePair.Before.Orders { t.Errorf("%v: %v", statePair.Case, order.Order) } t.Errorf("%v: ### Units after:", statePair.Case) for prov, unit := range s.Units() { t.Errorf("%v: %v %v", statePair.Case, prov, unit) } t.Errorf("%v: ### Dislodged after:", statePair.Case) for prov, unit := range s.Dislodgeds() { t.Errorf("%v: %v %v", statePair.Case, prov, unit) } t.Errorf("%v: ### Errors:", statePair.Case) for prov, err := range s.Resolutions() { t.Errorf("%v: %v %v", statePair.Case, prov, err) } t.Fatalf("%v failed", statePair.Case) } }