278 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			278 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package gountries
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"math/rand"
 | |
| 	"sort"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| )
 | |
| 
 | |
| func TestFindCountryByName(t *testing.T) {
 | |
| 
 | |
| 	var result Country
 | |
| 	var err error
 | |
| 
 | |
| 	// Test for lowercase
 | |
| 	//
 | |
| 
 | |
| 	result, err = query.FindCountryByName("sweden")
 | |
| 
 | |
| 	if err != nil {
 | |
| 		t.Fail()
 | |
| 	}
 | |
| 
 | |
| 	assert.Equal(t, result.Alpha2, "SE", "Lowercase country names should match")
 | |
| 
 | |
| 	// Test for common name
 | |
| 	result, err = query.FindCountryByName("United States")
 | |
| 
 | |
| 	if err != nil {
 | |
| 		t.Fail()
 | |
| 	}
 | |
| 
 | |
| 	assert.Equal(t, result.Alpha2, "US", "Lowercase country names should match")
 | |
| 
 | |
| 	// Test for official name
 | |
| 	result, err = query.FindCountryByName("United States of America")
 | |
| 
 | |
| 	if err != nil {
 | |
| 		t.Fail()
 | |
| 	}
 | |
| 
 | |
| 	assert.Equal(t, result.Alpha2, "US", "Lowercase country names should match")
 | |
| 
 | |
| 	// Test for uppercase
 | |
| 	//
 | |
| 
 | |
| 	result, err = query.FindCountryByName("SWEDEN")
 | |
| 
 | |
| 	if err != nil {
 | |
| 		t.Fail()
 | |
| 	}
 | |
| 
 | |
| 	assert.Equal(t, result.Alpha2, "SE", "Uppercase country names should match")
 | |
| 
 | |
| 	// Test for invariants
 | |
| 	//
 | |
| 
 | |
| 	invariants := []string{"Sweden", "SwEdEn", "SWEden"}
 | |
| 
 | |
| 	for _, invariant := range invariants {
 | |
| 
 | |
| 		result, err = query.FindCountryByName(invariant)
 | |
| 
 | |
| 		if err != nil {
 | |
| 			t.Fail()
 | |
| 		}
 | |
| 
 | |
| 		assert.Equal(t, result.Alpha2, "SE", fmt.Sprintf("Invariants of country names, eg sWeden,SWEDEN,swEdEn should match. %s did not match", invariant))
 | |
| 
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| func TestFindCountryByAlpha(t *testing.T) {
 | |
| 
 | |
| 	var result Country
 | |
| 	var err error
 | |
| 
 | |
| 	// Test for lowercase
 | |
| 	//
 | |
| 
 | |
| 	result, err = query.FindCountryByAlpha("se")
 | |
| 
 | |
| 	if err != nil {
 | |
| 		t.Fail()
 | |
| 	}
 | |
| 
 | |
| 	assert.Equal(t, result.Alpha2, "SE", "Lowercase country names should match")
 | |
| 
 | |
| 	// Test for uppercase
 | |
| 	//
 | |
| 
 | |
| 	result, err = query.FindCountryByAlpha("SE")
 | |
| 
 | |
| 	if err != nil {
 | |
| 		t.Fail()
 | |
| 	}
 | |
| 
 | |
| 	assert.Equal(t, result.Alpha2, "SE", "Uppercase country names should match")
 | |
| 
 | |
| 	// Test for invariants
 | |
| 	//
 | |
| 
 | |
| 	result, err = query.FindCountryByAlpha("Se")
 | |
| 
 | |
| 	if err != nil {
 | |
| 		t.Fail()
 | |
| 	}
 | |
| 
 | |
| 	assert.Equal(t, result.Alpha2, "SE", "Invariants of country names, eg sWeden,SWEDEN,swEdEn should match")
 | |
| 
 | |
| 	// Test for wrong code types (wrong length)
 | |
| 	//
 | |
| 
 | |
| 	result, err = query.FindCountryByAlpha("SEE")
 | |
| 
 | |
| 	if err != nil {
 | |
| 		assert.EqualError(t, err, "gountries error. Could not find country with code: SEE")
 | |
| 
 | |
| 	} else {
 | |
| 		t.Fail()
 | |
| 	}
 | |
| 
 | |
| 	// Test for wrong code types: too long
 | |
| 	//
 | |
| 
 | |
| 	result, err = query.FindCountryByAlpha("SEEE")
 | |
| 
 | |
| 	if err != nil {
 | |
| 		assert.EqualError(t, err, "gountries error. Invalid code format: SEEE")
 | |
| 
 | |
| 	} else {
 | |
| 		t.Fail()
 | |
| 	}
 | |
| 
 | |
| 	// Test for wrong code types: too short
 | |
| 	//
 | |
| 
 | |
| 	result, err = query.FindCountryByAlpha("S")
 | |
| 
 | |
| 	if err != nil {
 | |
| 		assert.EqualError(t, err, "gountries error. Invalid code format: S")
 | |
| 
 | |
| 	} else {
 | |
| 		t.Fail()
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| func TestFindAllCountries(t *testing.T) {
 | |
| 
 | |
| 	assert.Len(t, query.FindAllCountries(), 247)
 | |
| 
 | |
| }
 | |
| 
 | |
| func TestFindCountries(t *testing.T) {
 | |
| 
 | |
| 	country := Country{}
 | |
| 	country.Alpha2 = "SE"
 | |
| 
 | |
| 	countries := query.FindCountries(country)
 | |
| 
 | |
| 	assert.Len(t, countries, 1)
 | |
| 
 | |
| 	assert.Equal(t, countries[0].Alpha2, "SE", fmt.Sprintf("Countries did not return expected result %s: %s", "SE", countries[0].Alpha2))
 | |
| 
 | |
| }
 | |
| 
 | |
| func TestFindCountriesByRegion(t *testing.T) {
 | |
| 
 | |
| 	country := Country{}
 | |
| 	country.Geo.Region = "Europe"
 | |
| 
 | |
| 	countries := query.FindCountries(country)
 | |
| 
 | |
| 	assert.Len(t, countries, 52) // 52 is not the exact number of countries in Europe. Fix this later
 | |
| 
 | |
| }
 | |
| 
 | |
| func TestFindCountriesByContinent(t *testing.T) {
 | |
| 
 | |
| 	country := Country{}
 | |
| 	country.Geo.Continent = "Europe"
 | |
| 
 | |
| 	countries := query.FindCountries(country)
 | |
| 
 | |
| 	assert.Len(t, countries, 52) // 52 is not the exact number of countries in Europe. Fix this later
 | |
| 
 | |
| }
 | |
| 
 | |
| func TestFindCountriesBySubRegion(t *testing.T) {
 | |
| 
 | |
| 	country := Country{}
 | |
| 	country.Geo.SubRegion = "Eastern Asia"
 | |
| 
 | |
| 	countries := query.FindCountries(country)
 | |
| 
 | |
| 	assert.Len(t, countries, 8) // 8 is not the exact number of countries in Eastern Asia. Fix this later
 | |
| 
 | |
| }
 | |
| 
 | |
| func ExampleFindCountriesBorderingCountries() {
 | |
| 
 | |
| 	country := Country{}
 | |
| 	//country.Alpha3 = "AUT"
 | |
| 	country.Borders = []string{
 | |
| 		"DEU",
 | |
| 	}
 | |
| 
 | |
| 	countries := query.FindCountries(country)
 | |
| 	var c []string
 | |
| 	for _, country := range countries {
 | |
| 		c = append(c, country.Name.Common)
 | |
| 	}
 | |
| 	sort.Strings(c)
 | |
| 	for _, name := range c {
 | |
| 		fmt.Println(name)
 | |
| 	}
 | |
| 
 | |
| 	// Output:
 | |
| 	//Austria
 | |
| 	//Belgium
 | |
| 	//Czech Republic
 | |
| 	//Denmark
 | |
| 	//France
 | |
| 	//Luxembourg
 | |
| 	//Netherlands
 | |
| 	//Poland
 | |
| 	//Switzerland
 | |
| 
 | |
| }
 | |
| 
 | |
| func ExampleFindCountriesBorderingCountries2() {
 | |
| 
 | |
| 	country := Country{
 | |
| 		Borders: []string{
 | |
| 			"DEU",
 | |
| 			"CHE",
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	countries := query.FindCountries(country)
 | |
| 	var c []string
 | |
| 	for _, country := range countries {
 | |
| 		c = append(c, country.Name.Common)
 | |
| 	}
 | |
| 	sort.Strings(c)
 | |
| 	for _, name := range c {
 | |
| 		fmt.Println(name)
 | |
| 	}
 | |
| 
 | |
| 	// Output:
 | |
| 	//Austria
 | |
| 	//France
 | |
| 
 | |
| }
 | |
| 
 | |
| var result Country
 | |
| 
 | |
| func BenchmarkCountryLookupByName(b *testing.B) {
 | |
| 
 | |
| 	q := New()
 | |
| 	var names []string
 | |
| 	for key := range q.Countries {
 | |
| 		names = append(names, q.Countries[key].Name.Common)
 | |
| 	}
 | |
| 	for n := 0; n <= b.N; n++ {
 | |
| 		randIndex := rand.Intn(len(q.Countries))
 | |
| 		c, err := q.FindCountryByName(names[randIndex])
 | |
| 		if err != nil {
 | |
| 			b.Fail()
 | |
| 		}
 | |
| 		result = c
 | |
| 	}
 | |
| }
 |