package letter

import (
	"reflect"
	"testing"
)

// In the separate file frequency.go, you are given a function, Frequency(),
// to sequentially count letter frequencies in a single text.
// Perform this exercise on parallelism using Go concurrency features.
// Make concurrent calls to Frequency and combine results to obtain the answer.

func TestConcurrentFrequency(t *testing.T) {
	seq := Frequency(euro + dutch + us)
	con := ConcurrentFrequency([]string{euro, dutch, us})
	if !reflect.DeepEqual(con, seq) {
		t.Fatal("ConcurrentFrequency wrong result")
	}
}

var (
	euro = `Freude schöner Götterfunken
Tochter aus Elysium,
Wir betreten feuertrunken,
Himmlische, dein Heiligtum!
Deine Zauber binden wieder
Was die Mode streng geteilt;
Alle Menschen werden Brüder,
Wo dein sanfter Flügel weilt.`
	dutch = `Wilhelmus van Nassouwe
ben ik, van Duitsen bloed,
den vaderland getrouwe
blijf ik tot in den dood.
Een Prinse van Oranje
ben ik, vrij, onverveerd,
den Koning van Hispanje
heb ik altijd geëerd.`
	us = `O say can you see by the dawn's early light,
What so proudly we hailed at the twilight's last gleaming,
Whose broad stripes and bright stars through the perilous fight,
O'er the ramparts we watched, were so gallantly streaming?
And the rockets' red glare, the bombs bursting in air,
Gave proof through the night that our flag was still there;
O say does that star-spangled banner yet wave,
O'er the land of the free and the home of the brave?`
)

func BenchmarkConcurrentFrequency(b *testing.B) {
	b.StopTimer()
	var bTest []string
	for i := 0; i < 5; i++ {
		bTest = append(bTest, euro)
		bTest = append(bTest, dutch)
		bTest = append(bTest, us)
	}
	b.StartTimer()
	ConcurrentFrequency(bTest)
	b.StopTimer()
}

func BenchmarkMyConcurrentFrequency(b *testing.B) {
	b.StopTimer()
	var bTest []string
	for i := 0; i < 5; i++ {
		bTest = append(bTest, euro)
		bTest = append(bTest, dutch)
		bTest = append(bTest, us)
	}
	b.StartTimer()
	MyConcurrentFrequency(bTest)
	b.StopTimer()
}
