| package gstruct_test |
| |
| import ( |
| . "github.com/onsi/ginkgo" |
| . "github.com/onsi/gomega" |
| . "github.com/onsi/gomega/gstruct" |
| ) |
| |
| var _ = Describe("Slice", func() { |
| allElements := []string{"a", "b"} |
| missingElements := []string{"a"} |
| extraElements := []string{"a", "b", "c"} |
| duplicateElements := []string{"a", "a", "b"} |
| empty := []string{} |
| var nils []string |
| |
| It("should strictly match all elements", func() { |
| m := MatchAllElements(id, Elements{ |
| "b": Equal("b"), |
| "a": Equal("a"), |
| }) |
| Ω(allElements).Should(m, "should match all elements") |
| Ω(missingElements).ShouldNot(m, "should fail with missing elements") |
| Ω(extraElements).ShouldNot(m, "should fail with extra elements") |
| Ω(duplicateElements).ShouldNot(m, "should fail with duplicate elements") |
| Ω(nils).ShouldNot(m, "should fail with an uninitialized slice") |
| |
| m = MatchAllElements(id, Elements{ |
| "a": Equal("a"), |
| "b": Equal("fail"), |
| }) |
| Ω(allElements).ShouldNot(m, "should run nested matchers") |
| |
| m = MatchAllElements(id, Elements{}) |
| Ω(empty).Should(m, "should handle empty slices") |
| Ω(allElements).ShouldNot(m, "should handle only empty slices") |
| Ω(nils).Should(m, "should handle nil slices") |
| }) |
| |
| It("should ignore extra elements", func() { |
| m := MatchElements(id, IgnoreExtras, Elements{ |
| "b": Equal("b"), |
| "a": Equal("a"), |
| }) |
| Ω(allElements).Should(m, "should match all elements") |
| Ω(missingElements).ShouldNot(m, "should fail with missing elements") |
| Ω(extraElements).Should(m, "should ignore extra elements") |
| Ω(duplicateElements).ShouldNot(m, "should fail with duplicate elements") |
| Ω(nils).ShouldNot(m, "should fail with an uninitialized slice") |
| }) |
| |
| It("should ignore missing elements", func() { |
| m := MatchElements(id, IgnoreMissing, Elements{ |
| "a": Equal("a"), |
| "b": Equal("b"), |
| }) |
| Ω(allElements).Should(m, "should match all elements") |
| Ω(missingElements).Should(m, "should ignore missing elements") |
| Ω(extraElements).ShouldNot(m, "should fail with extra elements") |
| Ω(duplicateElements).ShouldNot(m, "should fail with duplicate elements") |
| Ω(nils).Should(m, "should ignore an uninitialized slice") |
| }) |
| |
| It("should ignore missing and extra elements", func() { |
| m := MatchElements(id, IgnoreMissing|IgnoreExtras, Elements{ |
| "a": Equal("a"), |
| "b": Equal("b"), |
| }) |
| Ω(allElements).Should(m, "should match all elements") |
| Ω(missingElements).Should(m, "should ignore missing elements") |
| Ω(extraElements).Should(m, "should ignore extra elements") |
| Ω(duplicateElements).ShouldNot(m, "should fail with duplicate elements") |
| Ω(nils).Should(m, "should ignore an uninitialized slice") |
| |
| m = MatchElements(id, IgnoreExtras|IgnoreMissing, Elements{ |
| "a": Equal("a"), |
| "b": Equal("fail"), |
| }) |
| Ω(allElements).ShouldNot(m, "should run nested matchers") |
| }) |
| |
| Context("with elements that share a key", func() { |
| nonUniqueID := func(element interface{}) string { |
| return element.(string)[0:1] |
| } |
| |
| allElements := []string{"a123", "a213", "b321"} |
| includingBadElements := []string{"a123", "b123", "b5555"} |
| extraElements := []string{"a123", "b1234", "c345"} |
| missingElements := []string{"b123", "b1234", "b1345"} |
| |
| It("should strictly allow multiple matches", func() { |
| m := MatchElements(nonUniqueID, AllowDuplicates, Elements{ |
| "a": ContainSubstring("1"), |
| "b": ContainSubstring("1"), |
| }) |
| Ω(allElements).Should(m, "should match all elements") |
| Ω(includingBadElements).ShouldNot(m, "should reject if a member fails the matcher") |
| Ω(extraElements).ShouldNot(m, "should reject with extra keys") |
| Ω(missingElements).ShouldNot(m, "should reject with missing keys") |
| Ω(nils).ShouldNot(m, "should fail with an uninitialized slice") |
| }) |
| |
| It("should ignore missing", func() { |
| m := MatchElements(nonUniqueID, AllowDuplicates|IgnoreMissing, Elements{ |
| "a": ContainSubstring("1"), |
| "b": ContainSubstring("1"), |
| }) |
| Ω(allElements).Should(m, "should match all elements") |
| Ω(includingBadElements).ShouldNot(m, "should reject if a member fails the matcher") |
| Ω(extraElements).ShouldNot(m, "should reject with extra keys") |
| Ω(missingElements).Should(m, "should allow missing keys") |
| Ω(nils).Should(m, "should allow an uninitialized slice") |
| }) |
| |
| It("should ignore extras", func() { |
| m := MatchElements(nonUniqueID, AllowDuplicates|IgnoreExtras, Elements{ |
| "a": ContainSubstring("1"), |
| "b": ContainSubstring("1"), |
| }) |
| Ω(allElements).Should(m, "should match all elements") |
| Ω(includingBadElements).ShouldNot(m, "should reject if a member fails the matcher") |
| Ω(extraElements).Should(m, "should allow extra keys") |
| Ω(missingElements).ShouldNot(m, "should reject missing keys") |
| Ω(nils).ShouldNot(m, "should reject an uninitialized slice") |
| }) |
| |
| It("should ignore missing and extras", func() { |
| m := MatchElements(nonUniqueID, AllowDuplicates|IgnoreExtras|IgnoreMissing, Elements{ |
| "a": ContainSubstring("1"), |
| "b": ContainSubstring("1"), |
| }) |
| Ω(allElements).Should(m, "should match all elements") |
| Ω(includingBadElements).ShouldNot(m, "should reject if a member fails the matcher") |
| Ω(extraElements).Should(m, "should allow extra keys") |
| Ω(missingElements).Should(m, "should allow missing keys") |
| Ω(nils).Should(m, "should allow an uninitialized slice") |
| }) |
| }) |
| }) |
| |
| func id(element interface{}) string { |
| return element.(string) |
| } |