mirror of
https://github.com/metabarcoding/obitools4.git
synced 2025-06-29 08:10:45 +00:00
303 lines
10 KiB
Go
303 lines
10 KiB
Go
package obiutils
|
|
|
|
import (
|
|
"reflect"
|
|
"sort"
|
|
"testing"
|
|
)
|
|
|
|
// TestMakeSet tests the MakeSet function.
|
|
//
|
|
// The function is tested with an empty set, integer values, and string values.
|
|
// It checks if the returned set matches the expected set for each case.
|
|
// If any test fails, an error message is printed with the expected and actual sets.
|
|
func TestMakeSet(t *testing.T) {
|
|
// Testing with an empty set
|
|
set := MakeSet[int]()
|
|
if len(set) != 0 {
|
|
t.Errorf("Expected an empty set, but got a set with length %d", len(set))
|
|
}
|
|
|
|
// Testing with integer values
|
|
intSet := MakeSet(1, 2, 3)
|
|
expectedIntSet := Set[int]{1: {}, 2: {}, 3: {}}
|
|
if !reflect.DeepEqual(intSet, expectedIntSet) {
|
|
t.Errorf("Expected set %v, but got %v", expectedIntSet, intSet)
|
|
}
|
|
|
|
// Testing with string values
|
|
strSet := MakeSet("apple", "banana", "orange")
|
|
expectedStrSet := Set[string]{"apple": {}, "banana": {}, "orange": {}}
|
|
if !reflect.DeepEqual(strSet, expectedStrSet) {
|
|
t.Errorf("Expected set %v, but got %v", expectedStrSet, strSet)
|
|
}
|
|
}
|
|
|
|
// TestNewSet tests the NewSet function.
|
|
//
|
|
// Test Case 1: Creating a set with no values.
|
|
// Test Case 2: Creating a set with multiple values.
|
|
//
|
|
// Parameters:
|
|
// - t: *testing.T - the testing object.
|
|
//
|
|
// Return type: void.
|
|
func TestNewSet(t *testing.T) {
|
|
// Test Case 1: Creating a set with no values
|
|
set1 := NewSet[int]()
|
|
if len(*set1) != 0 {
|
|
t.Errorf("Expected size to be 0, but got %d", len(*set1))
|
|
}
|
|
|
|
// Test Case 2: Creating a set with multiple values
|
|
set2 := NewSet("apple", "banana", "cherry")
|
|
if len(*set2) != 3 {
|
|
t.Errorf("Expected size to be 3, but got %d", len(*set2))
|
|
}
|
|
if !set2.Contains("apple") {
|
|
t.Errorf("Expected set to contain 'apple', but it didn't")
|
|
}
|
|
if !set2.Contains("banana") {
|
|
t.Errorf("Expected set to contain 'banana', but it didn't")
|
|
}
|
|
if !set2.Contains("cherry") {
|
|
t.Errorf("Expected set to contain 'cherry', but it didn't")
|
|
}
|
|
}
|
|
|
|
// TestSet_Add tests the Add method of the Set type.
|
|
//
|
|
// It verifies that the Add method properly adds a single value to the set
|
|
// and that it correctly adds multiple values as well.
|
|
// The function takes a testing.T parameter for error reporting.
|
|
func TestSet_Add(t *testing.T) {
|
|
// Test adding a single value
|
|
s := MakeSet[int]()
|
|
s.Add(1)
|
|
if !s.Contains(1) {
|
|
t.Errorf("Expected value 1 to be added to the set")
|
|
}
|
|
|
|
// Test adding multiple values
|
|
s.Add(2, 3, 4)
|
|
if !s.Contains(2) {
|
|
t.Errorf("Expected value 2 to be added to the set")
|
|
}
|
|
if !s.Contains(3) {
|
|
t.Errorf("Expected value 3 to be added to the set")
|
|
}
|
|
if !s.Contains(4) {
|
|
t.Errorf("Expected value 4 to be added to the set")
|
|
}
|
|
}
|
|
|
|
// TestSetContains tests the Contains method of the Set type.
|
|
//
|
|
// It checks whether the element is present in the set or not.
|
|
// The function takes a testing.T parameter and does not return any value.
|
|
func TestSetContains(t *testing.T) {
|
|
// Test case 1: Element is present in the set
|
|
setInt := NewSet[int]()
|
|
setInt.Add(1)
|
|
setInt.Add(2)
|
|
if !setInt.Contains(1) {
|
|
t.Error("Expected set to contain element 1")
|
|
}
|
|
|
|
// Test case 2: Element is not present in the set
|
|
setString := NewSet[string]()
|
|
setString.Add("a")
|
|
setString.Add("b")
|
|
if setString.Contains("c") {
|
|
t.Error("Expected set to not contain element c")
|
|
}
|
|
}
|
|
|
|
// TestMembers tests the Members method of the Set struct in the Go code.
|
|
//
|
|
// This function includes two test cases:
|
|
// 1. Test case 1: Empty set
|
|
// - It creates an empty set using the MakeSet function.
|
|
// - It defines the expected and actual values as empty slices of integers.
|
|
// - It calls the Members method on the set and sorts the returned slice.
|
|
// - It checks if the actual slice is equal to the expected slice using reflect.DeepEqual.
|
|
// - If the actual and expected slices are not equal, it reports an error.
|
|
//
|
|
// 2. Test case 2: Set with multiple elements
|
|
// - It creates a set with the elements 1, 2, and 3 using the MakeSet function.
|
|
// - It defines the expected and actual values as slices of integers.
|
|
// - It calls the Members method on the set and sorts the returned slice.
|
|
// - It checks if the actual slice is equal to the expected slice using reflect.DeepEqual.
|
|
// - If the actual and expected slices are not equal, it reports an error.
|
|
//
|
|
// Parameters:
|
|
// - t: The testing.T pointer for running the tests and reporting errors.
|
|
//
|
|
// Return type:
|
|
// This function does not return anything.
|
|
func TestMembers(t *testing.T) {
|
|
// Test case 1: Empty set
|
|
set := MakeSet[int]()
|
|
expected := []int{}
|
|
actual := set.Members()
|
|
sort.Ints(actual)
|
|
sort.Ints(expected)
|
|
if !reflect.DeepEqual(actual, expected) {
|
|
t.Errorf("Test case 1 failed. Expected %v but got %v", expected, actual)
|
|
}
|
|
|
|
// Test case 2: Set with multiple elements
|
|
set = MakeSet(1, 2, 3)
|
|
expected = []int{1, 2, 3}
|
|
actual = set.Members()
|
|
sort.Ints(actual)
|
|
sort.Ints(expected)
|
|
if !reflect.DeepEqual(actual, expected) {
|
|
t.Errorf("Test case 2 failed. Expected %v but got %v", expected, actual)
|
|
}
|
|
}
|
|
|
|
// TestSetString tests the String method of the Set type in Go.
|
|
//
|
|
// This function checks the string representation of different sets and compares them with the expected values.
|
|
// It verifies the correctness of the String method for empty sets, sets with a single member, and sets with multiple members.
|
|
// If any of the string representations do not match the expected values, an error message is printed.
|
|
func TestSetString(t *testing.T) {
|
|
// Test empty set
|
|
emptySet := NewSet[int]()
|
|
emptySetString := emptySet.String()
|
|
expectedEmptySetString := "[]"
|
|
if emptySetString != expectedEmptySetString {
|
|
t.Errorf("String representation of empty set is incorrect, got: %s, want: %s", emptySetString, expectedEmptySetString)
|
|
}
|
|
|
|
// Test set with single member
|
|
singleMemberSet := NewSet(42)
|
|
singleMemberSetString := singleMemberSet.String()
|
|
expectedSingleMemberSetString := "[42]"
|
|
if singleMemberSetString != expectedSingleMemberSetString {
|
|
t.Errorf("String representation of set with single member is incorrect, got: %s, want: %s", singleMemberSetString, expectedSingleMemberSetString)
|
|
}
|
|
|
|
// Test set with multiple members
|
|
multipleMembersSet := NewSet(1, 2, 3)
|
|
multipleMembersSetString := multipleMembersSet.String()
|
|
expectedMultipleMembersSetString := "[1 2 3]"
|
|
if multipleMembersSetString != expectedMultipleMembersSetString {
|
|
t.Errorf("String representation of set with multiple members is incorrect, got: %s, want: %s", multipleMembersSetString, expectedMultipleMembersSetString)
|
|
}
|
|
}
|
|
|
|
// TestUnion tests the Union method of the Set struct.
|
|
//
|
|
// The function checks different test cases for the Union method:
|
|
// 1. Union of two empty sets should return an empty set.
|
|
// 2. Union of an empty set and a non-empty set should return the non-empty set.
|
|
// 3. Union of two non-empty sets with common elements should return a set with unique elements.
|
|
// 4. Union of two non-empty sets with no common elements should return a set with all elements.
|
|
//
|
|
// Parameters:
|
|
// - t: The testing.T object for running test cases and reporting failures.
|
|
//
|
|
// Return type:
|
|
// None.
|
|
func TestUnion(t *testing.T) {
|
|
// Test case 1: Union of two empty sets should return an empty set
|
|
set1 := MakeSet[int]()
|
|
set2 := MakeSet[int]()
|
|
expected := MakeSet[int]()
|
|
result := set1.Union(set2)
|
|
if !reflect.DeepEqual(result, expected) {
|
|
t.Errorf("Expected %v, but got %v", expected, result)
|
|
}
|
|
|
|
// Test case 2: Union of an empty set and a non-empty set should return the non-empty set
|
|
set1 = MakeSet[int]()
|
|
set2 = MakeSet(1, 2, 3)
|
|
expected = MakeSet(1, 2, 3)
|
|
result = set1.Union(set2)
|
|
if !reflect.DeepEqual(result, expected) {
|
|
t.Errorf("Expected %v, but got %v", expected, result)
|
|
}
|
|
|
|
// Test case 3: Union of two non-empty sets with common elements should return a set with unique elements
|
|
set1 = MakeSet(1, 2, 3)
|
|
set2 = MakeSet(2, 3, 4)
|
|
expected = MakeSet(1, 2, 3, 4)
|
|
result = set1.Union(set2)
|
|
if !reflect.DeepEqual(result, expected) {
|
|
t.Errorf("Expected %v, but got %v", expected, result)
|
|
}
|
|
|
|
// Test case 4: Union of two non-empty sets with no common elements should return a set with all elements
|
|
set1 = MakeSet(1, 2, 3)
|
|
set2 = MakeSet(4, 5, 6)
|
|
expected = MakeSet(1, 2, 3, 4, 5, 6)
|
|
result = set1.Union(set2)
|
|
if !reflect.DeepEqual(result, expected) {
|
|
t.Errorf("Expected %v, but got %v", expected, result)
|
|
}
|
|
}
|
|
|
|
// TestIntersection is a test function that checks the Intersection method of the Set type.
|
|
//
|
|
// It tests the following scenarios:
|
|
// - Test case 1: Intersection of two empty sets should return an empty set
|
|
// - Test case 2: Intersection of an empty set and a non-empty set should return an empty set
|
|
// - Test case 3: Intersection of two sets with common elements should return a set with those common elements
|
|
// - Test case 4: Intersection of two sets with no common elements should return an empty set
|
|
//
|
|
// Parameters:
|
|
// - t: A testing.T object to report test failures
|
|
//
|
|
// Return type: None
|
|
func TestIntersection(t *testing.T) {
|
|
// Test case 1: Intersection of two empty sets should return an empty set
|
|
emptySet1 := MakeSet[int]()
|
|
emptySet2 := MakeSet[int]()
|
|
expectedResult1 := MakeSet[int]()
|
|
result1 := emptySet1.Intersection(emptySet2)
|
|
if !reflect.DeepEqual(result1, expectedResult1) {
|
|
t.Errorf("Intersection of two empty sets returned incorrect result. Expected: %v, got: %v", expectedResult1, result1)
|
|
}
|
|
|
|
// Test case 2: Intersection of an empty set and a non-empty set should return an empty set
|
|
emptySet3 := MakeSet[string]()
|
|
nonEmptySet1 := MakeSet[string]()
|
|
nonEmptySet1.Add("a")
|
|
expectedResult2 := MakeSet[string]()
|
|
result2 := emptySet3.Intersection(nonEmptySet1)
|
|
if !reflect.DeepEqual(result2, expectedResult2) {
|
|
t.Errorf("Intersection of an empty set and a non-empty set returned incorrect result. Expected: %v, got: %v", expectedResult2, result2)
|
|
}
|
|
|
|
// Test case 3: Intersection of two sets with common elements should return a set with those common elements
|
|
set1 := MakeSet[int]()
|
|
set1.Add(1)
|
|
set1.Add(2)
|
|
set1.Add(3)
|
|
set2 := MakeSet[int]()
|
|
set2.Add(3)
|
|
set2.Add(4)
|
|
expectedResult3 := MakeSet[int]()
|
|
expectedResult3.Add(3)
|
|
result3 := set1.Intersection(set2)
|
|
if !reflect.DeepEqual(result3, expectedResult3) {
|
|
t.Errorf("Intersection of two sets with common elements returned incorrect result. Expected: %v, got: %v", expectedResult3, result3)
|
|
}
|
|
|
|
// Test case 4: Intersection of two sets with no common elements should return an empty set
|
|
set3 := MakeSet[string]()
|
|
set3.Add("a")
|
|
set3.Add("b")
|
|
set3.Add("c")
|
|
set4 := MakeSet[string]()
|
|
set4.Add("x")
|
|
set4.Add("y")
|
|
expectedResult4 := MakeSet[string]()
|
|
result4 := set3.Intersection(set4)
|
|
if !reflect.DeepEqual(result4, expectedResult4) {
|
|
t.Errorf("Intersection of two sets with no common elements returned incorrect result. Expected: %v, got: %v", expectedResult4, result4)
|
|
}
|
|
}
|