369 lines
7.0 KiB
Go
369 lines
7.0 KiB
Go
package stringset
|
||
|
||
// Source: exercism/x-common
|
||
// Commit: 269f498 Merge pull request #48 from soniakeys/custom-set-json
|
||
|
||
// Test two sets for equality.
|
||
var eqCases = []binBoolCase{
|
||
{ // order doesn't matter
|
||
[]string{"a", "c"},
|
||
[]string{"c", "a"},
|
||
true,
|
||
},
|
||
{ // dupicates don't matter
|
||
[]string{"a", "a"},
|
||
[]string{"a"},
|
||
true,
|
||
},
|
||
{ // empty sets are equal
|
||
[]string{},
|
||
[]string{},
|
||
true,
|
||
},
|
||
{ // set with single element is equal to itself
|
||
[]string{"a"},
|
||
[]string{"a"},
|
||
true,
|
||
},
|
||
{ // different sets are not equal
|
||
[]string{"a", "b", "c"},
|
||
[]string{"c", "d", "e"},
|
||
false,
|
||
},
|
||
{ // empty set is not equal to non-empty set
|
||
[]string{},
|
||
[]string{"a", "b", "c"},
|
||
false,
|
||
},
|
||
{ // non-empty set is not equal to empty set
|
||
[]string{"a", "b", "c"},
|
||
[]string{},
|
||
false,
|
||
},
|
||
{ // having most in common is not good enough
|
||
[]string{"a", "b", "c", "d"},
|
||
[]string{"b", "c", "d", "e"},
|
||
false,
|
||
},
|
||
}
|
||
|
||
// Add an element to a set.
|
||
var addCases = []eleOpCase{
|
||
{ // add to empty set
|
||
[]string{},
|
||
"c",
|
||
[]string{"c"},
|
||
},
|
||
{ // add to non-empty set
|
||
[]string{"a", "b", "d"},
|
||
"c",
|
||
[]string{"a", "b", "c", "d"},
|
||
},
|
||
{ // add existing element
|
||
[]string{"a", "b", "c"},
|
||
"c",
|
||
[]string{"a", "b", "c"},
|
||
},
|
||
}
|
||
|
||
// Delete an element from a set.
|
||
var delCases = []eleOpCase{
|
||
{ // delete an element
|
||
[]string{"c", "b", "a"},
|
||
"b",
|
||
[]string{"a", "c"},
|
||
},
|
||
{ // delete an element not in set
|
||
[]string{"c", "b", "a"},
|
||
"d",
|
||
[]string{"a", "b", "c"},
|
||
},
|
||
}
|
||
|
||
// Test if is a set is empty.
|
||
var emptyCases = []unaryBoolCase{
|
||
{ // empty
|
||
[]string{},
|
||
true,
|
||
},
|
||
{ // single element
|
||
[]string{"a"},
|
||
false,
|
||
},
|
||
{ // a few elements
|
||
[]string{"a", "b", "c", "b"},
|
||
false,
|
||
},
|
||
}
|
||
|
||
// Return the cardinality of a set.
|
||
var lenCases = []unaryIntCase{
|
||
{ // empty set
|
||
[]string{},
|
||
0,
|
||
},
|
||
{ // non-empty set
|
||
[]string{"a", "b", "c"},
|
||
3,
|
||
},
|
||
{ // duplicate element
|
||
[]string{"a", "b", "c", "b"},
|
||
3,
|
||
},
|
||
}
|
||
|
||
// Test if a value is an element of a set.
|
||
var hasCases = []eleBoolCase{
|
||
{ // nothing is an element of the empty set
|
||
[]string{},
|
||
"a",
|
||
false,
|
||
},
|
||
{ // 1 is in the set
|
||
[]string{"a", "b", "c", "b"},
|
||
"a",
|
||
true,
|
||
},
|
||
{ // 2 is in the set
|
||
[]string{"a", "b", "c", "b"},
|
||
"b",
|
||
true,
|
||
},
|
||
{ // 3 is in the set
|
||
[]string{"a", "b", "c", "b"},
|
||
"c",
|
||
true,
|
||
},
|
||
{ // 4 not in the set
|
||
[]string{"a", "b", "c", "b"},
|
||
"d",
|
||
false,
|
||
},
|
||
}
|
||
|
||
// Test if set1 is a subset of set2.
|
||
var subsetCases = []binBoolCase{
|
||
{ // empty set is subset of itself
|
||
[]string{},
|
||
[]string{},
|
||
true,
|
||
},
|
||
{ // empty set is subset of non-empty set
|
||
[]string{},
|
||
[]string{"a"},
|
||
true,
|
||
},
|
||
{ // non-empty set is not subset of empty set
|
||
[]string{"a"},
|
||
[]string{},
|
||
false,
|
||
},
|
||
{ // non-empty set is subset of itself
|
||
[]string{"a", "b", "c"},
|
||
[]string{"a", "b", "c"},
|
||
true,
|
||
},
|
||
{ // proper subset
|
||
[]string{"a", "b", "c"},
|
||
[]string{"d", "a", "b", "c"},
|
||
true,
|
||
},
|
||
{ // same number of elements
|
||
[]string{"a", "b", "c"},
|
||
[]string{"d", "a", "c"},
|
||
false,
|
||
},
|
||
{ // superset
|
||
[]string{"a", "b", "c", "d", "e"},
|
||
[]string{"b", "c", "d"},
|
||
false,
|
||
},
|
||
{ // fewer elements but not a subset
|
||
[]string{"a", "b", "c", "k"},
|
||
[]string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"},
|
||
false,
|
||
},
|
||
}
|
||
|
||
// Test if two sets are disjoint.
|
||
var disjointCases = []binBoolCase{
|
||
{ // the empty set is disjoint with itself
|
||
[]string{},
|
||
[]string{},
|
||
true,
|
||
},
|
||
{ // empty set disjoint with non-empty set
|
||
[]string{},
|
||
[]string{"a"},
|
||
true,
|
||
},
|
||
{ // non-empty set disjoint with empty set
|
||
[]string{"a"},
|
||
[]string{},
|
||
true,
|
||
},
|
||
{ // one element in common
|
||
[]string{"a", "b"},
|
||
[]string{"b", "c"},
|
||
false,
|
||
},
|
||
{ // no elements in common
|
||
[]string{"a", "b"},
|
||
[]string{"c", "d"},
|
||
true,
|
||
},
|
||
}
|
||
|
||
// Produce the union of two sets.
|
||
var unionCases = []binOpCase{
|
||
{ // union of empty sets
|
||
[]string{},
|
||
[]string{},
|
||
[]string{},
|
||
},
|
||
{ // union of empty set with set of one element
|
||
[]string{},
|
||
[]string{"b"},
|
||
[]string{"b"},
|
||
},
|
||
{ // union of empty set with non-empty set
|
||
[]string{},
|
||
[]string{"c", "b", "e"},
|
||
[]string{"b", "c", "e"},
|
||
},
|
||
{ // union of non-empty set with empty set
|
||
[]string{"a", "c"},
|
||
[]string{},
|
||
[]string{"a", "c"},
|
||
},
|
||
{ // union of a set with itself
|
||
[]string{"a", "c"},
|
||
[]string{"c", "a"},
|
||
[]string{"a", "c"},
|
||
},
|
||
{ // union with one element
|
||
[]string{"a", "c"},
|
||
[]string{"b"},
|
||
[]string{"a", "b", "c"},
|
||
},
|
||
{ // one element in common, one different
|
||
[]string{"a", "c"},
|
||
[]string{"b", "c"},
|
||
[]string{"c", "b", "a"},
|
||
},
|
||
{ // two elements in common
|
||
[]string{"a", "b", "c", "d"},
|
||
[]string{"c", "b", "e"},
|
||
[]string{"a", "b", "c", "d", "e"},
|
||
},
|
||
}
|
||
|
||
// Intersect two sets.
|
||
var intersectionCases = []binOpCase{
|
||
{ // intersect empty sets
|
||
[]string{},
|
||
[]string{},
|
||
[]string{},
|
||
},
|
||
{ // intersect empty set with non-empty set
|
||
[]string{},
|
||
[]string{"c", "b", "e"},
|
||
[]string{},
|
||
},
|
||
{ // intersect non-empty set with empty set
|
||
[]string{"a", "b", "c", "d"},
|
||
[]string{},
|
||
[]string{},
|
||
},
|
||
{ // intersect one element with itself
|
||
[]string{"c"},
|
||
[]string{"c"},
|
||
[]string{"c"},
|
||
},
|
||
{ // one element in common, extra elements in both sets
|
||
[]string{"a", "b", "c"},
|
||
[]string{"c", "e", "d"},
|
||
[]string{"c"},
|
||
},
|
||
{ // two elements in common, extras in both sets
|
||
[]string{"a", "b", "c", "d"},
|
||
[]string{"c", "b", "e"},
|
||
[]string{"b", "c"},
|
||
},
|
||
{ // intersect with subset
|
||
[]string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"},
|
||
[]string{"e", "f", "g", "h", "i", "j"},
|
||
[]string{"e", "f", "g", "h", "i", "j"},
|
||
},
|
||
{ // nothing in common
|
||
[]string{"a", "b", "c"},
|
||
[]string{"d", "e", "f"},
|
||
[]string{},
|
||
},
|
||
}
|
||
|
||
// Produce the set difference (set1 - set2)
|
||
// or more specifically, (set1 ∖ set2)
|
||
var differenceCases = []binOpCase{
|
||
{ // difference of two empty sets
|
||
[]string{},
|
||
[]string{},
|
||
[]string{},
|
||
},
|
||
{ // difference of empty set and non-empty set
|
||
[]string{},
|
||
[]string{"c", "b", "e"},
|
||
[]string{},
|
||
},
|
||
{ // difference of non-empty set and empty set
|
||
[]string{"a", "b", "c", "d"},
|
||
[]string{},
|
||
[]string{"a", "b", "c", "d"},
|
||
},
|
||
{ // no elements in common
|
||
[]string{"a", "b", "c"},
|
||
[]string{"d"},
|
||
[]string{"a", "b", "c"},
|
||
},
|
||
{ // one element in common, one extra
|
||
[]string{"c", "b", "a"},
|
||
[]string{"b", "d"},
|
||
[]string{"a", "c"},
|
||
},
|
||
{ // two elements in common, one extra
|
||
[]string{"a", "b", "c", "d"},
|
||
[]string{"c", "b", "e"},
|
||
[]string{"a", "d"},
|
||
},
|
||
}
|
||
|
||
// Produce the symmetric difference of two sets. The symmetric
|
||
// difference consists of elements in one or the other but not both.
|
||
var symmetricDifferenceCases = []binOpCase{
|
||
{ // two empty sets
|
||
[]string{},
|
||
[]string{},
|
||
[]string{},
|
||
},
|
||
{ // empty set and non-empty set
|
||
[]string{},
|
||
[]string{"c", "b", "e"},
|
||
[]string{"c", "b", "e"},
|
||
},
|
||
{ // non-empty set and empty set
|
||
[]string{"a", "b", "c", "d"},
|
||
[]string{},
|
||
[]string{"a", "b", "c", "d"},
|
||
},
|
||
{ // no elements in common
|
||
[]string{"a", "b", "c"},
|
||
[]string{"d"},
|
||
[]string{"a", "b", "c", "d"},
|
||
},
|
||
{ // one element in common
|
||
[]string{"c", "b", "a"},
|
||
[]string{"b", "d"},
|
||
[]string{"a", "c", "d"},
|
||
},
|
||
}
|