package main

import "testing"

func TestGenerateSystemIsDeterministic(t *testing.T) {
	id := WayfarerSystemID{Galaxy: 1, Index: 42}
	a := GenerateSystem(id)
	b := GenerateSystem(id)
	if a != b {
		t.Fatalf("одна и та же система должна давать одинаковый результат: %+v vs %+v", a, b)
	}
}

func TestGenerateSystemDiffersByID(t *testing.T) {
	a := GenerateSystem(WayfarerSystemID{Galaxy: 0, Index: 0})
	b := GenerateSystem(WayfarerSystemID{Galaxy: 0, Index: 1})
	if a.Name == b.Name && a.X == b.X && a.Y == b.Y {
		t.Errorf("разные системы не должны совпадать целиком по всем параметрам")
	}
}

func TestGenerateSystemValueRanges(t *testing.T) {
	for g := 0; g < WayfarerGalaxyCount; g++ {
		for i := 0; i < WayfarerSystemsPerGalaxy; i++ {
			s := GenerateSystem(WayfarerSystemID{Galaxy: g, Index: i})
			if s.TechLevel < 0 || s.TechLevel > 15 {
				t.Fatalf("система %v: техуровень вне диапазона: %d", s.ID, s.TechLevel)
			}
			if s.Industrial < 0 || s.Industrial > 1 {
				t.Fatalf("система %v: индустриальность вне диапазона: %v", s.ID, s.Industrial)
			}
			if s.Wealth < 0 || s.Wealth > 1 {
				t.Fatalf("система %v: богатство вне диапазона: %v", s.ID, s.Wealth)
			}
			if s.Government < 0 || int(s.Government) >= int(wayfarerGovernmentCount) {
				t.Fatalf("система %v: неверное правительство: %v", s.ID, s.Government)
			}
			if s.X < 0 || s.X > wayfarerGalaxyMapSize || s.Y < 0 || s.Y > wayfarerGalaxyMapSize {
				t.Fatalf("система %v: координаты вне карты галактики: (%v,%v)", s.ID, s.X, s.Y)
			}
			if s.Name == "" {
				t.Fatalf("система %v: пустое название", s.ID)
			}
		}
	}
}

func TestGenerateSystemNameVarietyIsReasonable(t *testing.T) {
	names := map[string]bool{}
	for i := 0; i < 200; i++ {
		s := GenerateSystem(WayfarerSystemID{Galaxy: 0, Index: i})
		names[s.Name] = true
	}
	if len(names) < 100 {
		t.Errorf("ожидалось разумное разнообразие названий среди 200 систем, получено только %d уникальных", len(names))
	}
}

func TestDistanceSymmetric(t *testing.T) {
	a := GenerateSystem(WayfarerSystemID{Galaxy: 0, Index: 1})
	b := GenerateSystem(WayfarerSystemID{Galaxy: 0, Index: 2})
	if a.Distance(b) != b.Distance(a) {
		t.Errorf("расстояние должно быть симметричным")
	}
	if a.Distance(a) != 0 {
		t.Errorf("расстояние системы до самой себя должно быть 0")
	}
}

func TestDangerFactorMatchesGovernment(t *testing.T) {
	anarchy := WayfarerSystem{Government: GovAnarchy}
	corporate := WayfarerSystem{Government: GovCorporateState}
	if anarchy.DangerFactor() <= corporate.DangerFactor() {
		t.Errorf("анархия должна быть опаснее корпоративного государства")
	}
}
