func FFTR2CSpec(c gospec.Context) { signal := make([]float64, 16) F_signal := make([]complex128, 9) for i := range signal { signal[i] = math.Sin(float64(i) / float64(len(signal)) * math.Pi * 2) } forward := PlanDftR2C1d(signal, F_signal, Estimate) forward.Execute() c.Specify("Running a R2C transform doesn't destroy the input.", func() { for i := range signal { c.Expect(signal[i], gospec.Equals, math.Sin(float64(i)/float64(len(signal))*math.Pi*2)) } }) c.Specify("Forward 1d Real to Complex FFT works properly.", func() { c.Expect(real(F_signal[0]), gospec.IsWithin(1e-9), 0.0) c.Expect(imag(F_signal[0]), gospec.IsWithin(1e-9), 0.0) c.Expect(real(F_signal[1]), gospec.IsWithin(1e-9), 0.0) c.Expect(imag(F_signal[1]), gospec.IsWithin(1e-9), -float64(len(signal))/2) for i := 2; i < len(F_signal)-1; i++ { c.Expect(real(F_signal[i]), gospec.IsWithin(1e-9), 0.0) c.Expect(imag(F_signal[i]), gospec.IsWithin(1e-9), 0.0) } }) }
func CMWCRandSpec(c gospec.Context) { c.Specify("CMWC32 conforms properly to math/rand.Rand interface.", func() { c1 := cmwc.MakeCmwc(3278470471, 4) c2 := cmwc.MakeCmwc(3278470471, 4) c1.Seed(1234) c2.Seed(4321) // Make sure that we don't generate numbers with the most significant // bit set for i := 0; i < 1000000; i++ { v1 := c1.Int63() c.Expect(v1 >= 0, Equals, true) if v1 < 0 { break } c2.Int63() } // Make sure that two generators with the same parameters, but in // different states, are in the exact same state when seeded with // the same seed. c1.Seed(0xabcdef12) c2.Seed(0xabcdef12) for i := 0; i < 10000; i++ { v1 := c1.Int63() v2 := c2.Int63() c.Expect(v1, Equals, v2) if v1 != v2 { break } } }) }
func InterfaceTypeRegistrySpec(c gospec.Context) { c.Specify("Test that types containing interfaces are properly encoded.", func() { var tr core.TypeRegistry tr.Register(encodable6{}) tr.Register(BarerImpl1{}) tr.Register(BarerImpl2{}) tr.Complete() v1 := encodable6{ Interface: BarerImpl1{10, "foo"}, } v2 := encodable6{ Interface: BarerImpl2{3, 4}, } b := bytes.NewBuffer(nil) err := tr.Encode(v1, b) c.Assume(err, gospec.Equals, error(nil)) err = tr.Encode(v2, b) c.Assume(err, gospec.Equals, error(nil)) d1, err := tr.Decode(b) c.Assume(err, gospec.Equals, error(nil)) d2, err := tr.Decode(b) c.Assume(err, gospec.Equals, error(nil)) c1, ok := d1.(encodable6) c.Assume(ok, gospec.Equals, true) c.Expect(c1.Interface.Bar(), gospec.Equals, "10:foo") c2, ok := d2.(encodable6) c.Assume(ok, gospec.Equals, true) c.Expect(c2.Interface.Bar(), gospec.Equals, "3:4") }) }
func StackSpec(c gospec.Context) { stack := NewStack() c.Specify("An empty stack", func() { c.Specify("is empty", func() { c.Expect(stack.Empty(), IsTrue) }) c.Specify("After a push, the stack is no longer empty", func() { stack.Push("a push") c.Expect(stack.Empty(), IsFalse) }) }) c.Specify("When objects have been pushed onto a stack", func() { stack.Push("pushed first") stack.Push("pushed last") c.Specify("the object pushed last is popped first", func() { poppedFirst := stack.Pop() c.Expect(poppedFirst, Equals, "pushed last") }) c.Specify("the object pushed first is popped last", func() { stack.Pop() poppedLast := stack.Pop() c.Expect(poppedLast, Equals, "pushed first") }) c.Specify("After popping all objects, the stack is empty", func() { stack.Pop() stack.Pop() c.Expect(stack.Empty(), IsTrue) }) }) }
func FFT1dSpec(c gospec.Context) { signal := Alloc1d(16) new_in := Alloc1d(16) new_out := Alloc1d(16) for i := range signal { signal[i] = complex(float32(i), float32(-i)) new_in[i] = signal[i] } forward := PlanDft1d(signal, signal, Forward, Estimate) c.Specify("Creating a plan doesn't overwrite an existing array if fftw.Estimate is used.", func() { for i := range signal { c.Expect(signal[i], gospec.Equals, complex(float32(i), float32(-i))) } }) // A simple real cosine should result in transform with two spikes, one at S[1] and one at S[-1] // The spikes should be real and have amplitude equal to len(S)/2 (because fftw doesn't normalize) for i := range signal { signal[i] = complex(float32(math.Cos(float64(i)/float64(len(signal))*math.Pi*2)), 0) new_in[i] = signal[i] } forward.Execute() c.Specify("Forward 1d FFT works properly.", func() { peakVerifier(signal, c) }) // This should also be the case when using new arrays... forward.ExecuteNewArray(new_in, new_out) c.Specify("New array Forward 1d FFT works properly", func() { peakVerifier(new_out, c) }) }
func CommandNSpec(c gospec.Context) { c.Specify("Sample sprite loads correctly", func() { s, err := sprite.LoadSprite("test_sprite") c.Expect(err, Equals, nil) for i := 0; i < 2000; i++ { s.Think(50) } s.CommandN([]string{ "turn_right", "turn_right", "turn_right", "turn_right", "turn_right", "turn_right", "turn_left", "turn_left", "turn_right", "turn_right", "turn_right", "turn_left", "turn_left"}) s.Think(5000) c.Expect(s.Facing(), Equals, 1) for i := 0; i < 3000; i++ { s.Think(50) } }) }
func LoadSpriteSpec(c gospec.Context) { c.Specify("Sample sprite loads correctly", func() { s, err := sprite.LoadSprite("test_sprite") c.Expect(err, Equals, nil) for i := 0; i < 2000; i++ { s.Think(50) } s.Command("defend") s.Command("undamaged") s.Command("defend") s.Command("undamaged") for i := 0; i < 3000; i++ { s.Think(50) } s.Command("turn_right") s.Command("turn_right") s.Command("turn_right") s.Command("turn_right") s.Command("turn_right") s.Command("turn_right") s.Command("turn_left") s.Command("turn_left") s.Command("turn_right") s.Command("turn_right") s.Command("turn_right") s.Command("turn_left") s.Command("turn_left") // s.Think(5000) for i := 0; i < 300; i++ { s.Think(50) } c.Expect(s.Facing(), Equals, 1) }) }
func TopologicalSortSpec(c gospec.Context) { gr := NewDirectedMap() c.Specify("Single node graph", func() { gr.AddNode(VertexId(1)) nodes, hasCycle := TopologicalSort(gr) c.Expect(hasCycle, IsFalse) c.Expect(nodes, ContainsExactly, Values(VertexId(1))) }) c.Specify("Simple two nodes graph", func() { gr.AddArc(1, 2) nodes, hasCycle := TopologicalSort(gr) c.Expect(hasCycle, IsFalse) c.Expect(nodes, ContainsExactly, Values(VertexId(1), VertexId(2))) }) c.Specify("Pseudo loops", func() { gr.AddArc(1, 2) gr.AddArc(2, 3) gr.AddArc(1, 4) gr.AddArc(4, 3) _, hasCycle := TopologicalSort(gr) c.Expect(hasCycle, IsFalse) }) }
func PolySpec2(c gospec.Context) { p := linear.Poly{ {-1, 0}, {-3, 0}, {0, 10}, {3, 0}, {1, 0}, {2, 1}, {-2, 1}, } c.Specify("Check that exterior and interior segments of a polygon are correctly identified.", func() { visible_exterior := []linear.Seg2{ linear.MakeSeg2(-1, 0, -3, 0), linear.MakeSeg2(2, 1, -2, 1), linear.MakeSeg2(3, 0, 1, 0), } visible_interior := []linear.Seg2{ linear.MakeSeg2(2, 1, -2, 1), linear.MakeSeg2(-3, 0, 0, 10), linear.MakeSeg2(0, 10, 3, 0), linear.MakeSeg2(-1, 0, -3, 0), linear.MakeSeg2(3, 0, 1, 0), } c.Expect(p.VisibleExterior(linear.Vec2{0, -10}), ContainsExactly, visible_exterior) c.Expect(p.VisibleInterior(linear.Vec2{0, 5}), ContainsExactly, visible_interior) }) }
func MultiValueReturnSpec(c gospec.Context) { c.Specify("Functions with zero or more than one return values work.", func() { context := polish.MakeContext() polish.AddIntMathContext(context) rev3 := func(a, b, c int) (int, int, int) { return c, b, a } context.AddFunc("rev3", rev3) rev5 := func(a, b, c, d, e int) (int, int, int, int, int) { return e, d, c, b, a } context.AddFunc("rev5", rev5) res, err := context.Eval("- - - - rev5 rev3 1 2 rev3 4 5 6") c.Assume(len(res), Equals, 1) c.Assume(err, Equals, nil) // - - - - rev5 rev3 1 2 rev3 4 5 6 // - - - - rev5 rev3 1 2 6 5 4 // - - - - rev5 6 2 1 5 4 // - - - - 4 5 1 2 6 // - - - -1 1 2 6 // - - -2 2 6 // - -4 6 // -10 c.Expect(int(res[0].Int()), Equals, -10) }) }
func checkOrder(c gospec.Context, a adag, order []int) { c.Expect(len(a), Equals, len(order)) c.Specify("Ordering contains all vertices exactly once", func() { all := make(map[int]bool) for _, v := range order { all[v] = true } c.Expect(len(all), Equals, len(order)) for i := 0; i < len(a); i++ { c.Expect(all[i], Equals, true) } }) c.Specify("Successors of a vertex always occur later in the ordering", func() { for i := 0; i < len(order); i++ { all := a.AllSuccessors(order[i]) for j := range order { if i == j { continue } succ, ok := all[order[j]] if j < i { c.Expect(!ok, Equals, true) } else { c.Expect(!ok || succ, Equals, true) } } } }) }
func ComplexOperationsSpec(c gospec.Context) { c.Specify("Vec2.DistToLine() works.", func() { centers := []linear.Vec2{ linear.Vec2{10, 12}, linear.Vec2{1, -9}, linear.Vec2{-100, -42}, linear.Vec2{0, 1232}, } radiuses := []float64{3, 10.232, 435, 1} thetas := []float64{0.001, 0.1, 1, 1.01, 0.034241, 0.789, 90, 179, 180} angles := []float64{1.01, 1.0, 1.11111, 930142} for _, center := range centers { for _, radius := range radiuses { for _, angle := range angles { for _, theta := range thetas { a := linear.Vec2{math.Cos(angle), math.Sin(angle)} b := linear.Vec2{math.Cos(angle + theta), math.Sin(angle + theta)} seg := linear.Seg2{a.Scale(radius).Add(center), b.Scale(radius).Add(center)} dist := center.DistToLine(seg) real_dist := radius * math.Cos(theta/2) if real_dist < 0 { real_dist = -real_dist } c.Expect(dist, IsWithin(1e-9), real_dist) } } } } }) }
// Helpers func DecodePositionSpecs(c gospec.Context) { c.Specify("[Decode] Decodes GeoHash to PreciseLocation + Error", func() { value := Decode("ww8p1r4t8") c.Expect(value.Location.Latitude, gospec.Satisfies, value.Location.Latitude >= 37.83 && value.Location.Latitude <= (37.84)) c.Expect(value.Location.Longitude, gospec.Satisfies, value.Location.Longitude >= 112.55 && value.Location.Longitude <= (112.56)) }) }
func FindPortSpecs(c gospec.Context) { c.Specify("[findPort] Finds an open port", func() { port, err := findPort() c.Expect(err, gospec.Equals, nil) c.Expect(port, gospec.Satisfies, port >= 1024) }) }
func AcceptanceSpec(c gospec.Context) { c.Specify("When send structed data should return stracted data", func() { expectedData := &ResponseData{0, "3, 5, 7, 20"} actualData := &TaskData{0, PING, "3, 5, 7, 20"} var result = SendRequest(actualData) c.Expect(result.TaskId, Equals, expectedData.TaskId) c.Expect(result.ResultData, Equals, expectedData.ResultData) }) /*c.Specify("When send unsorted strings data should return sorted strings data", func() { actualData := &TaskData{0, SORT, "7, 3, 20, 5"} expectedData := &TaskData{0, SORT, "3, 5, 7, 20"} var result = SendRequest(actualData) c.Expect(result.TaskData, Equals, expectedData.TaskData) }) c.Specify("When send unsorted strings data processor should return sorted strings data", func() { actualData := &TaskData{0, SORT, "7, 3, 40, 5"} expectedData := &ResponseData{0, "3, 5, 7, 40"} requestChannel := make(chan domain.TaskData) responseChannel := make(chan domain.ResponseData) go server.TaskProcessor(requestChannel, responseChannel) requestChannel <- *actualData var result = <- responseChannel c.Expect(result.ResultData, Equals, expectedData.ResultData) c.Expect(result.TaskId, Equals, expectedData.TaskId) }) c.Specify("Test task processor with many tasks", func() { actualData := &TaskData{0, SORT, "7, 3, 40, 5"} expectedData := &ResponseData{0, "3, 5, 7, 40"} requestChannel := make(chan domain.TaskData, 100) responseChannel := make(chan domain.ResponseData, 100) go server.TaskProcessor(requestChannel, responseChannel) for i := 0; i < 10; i++ { requestChannel <- *actualData } killPackage := &TaskData{0, KILL, "7, 3, 40, 5"} requestChannel <- *killPackage for i := 0; i < 10; i++ { // requestChannel <- *actualData var result = <- responseChannel c.Expect(result.ResultData, Equals, expectedData.ResultData) c.Expect(result.TaskId, Equals, expectedData.TaskId) } })*/ }
func QuebraLinhaTest(c gospec.Context) { c.Specify("Caso texto seja menor q tamanho maximo", func() { c.Expect(QuebraLinha("ola mundo", 14), Equals, "ola mundo") }) c.Specify("Caso texto seja maior q tamanho maximo", func() { c.Expect(QuebraLinha("lavarini lindo demais", 15), Equals, "lavarini lindo\ndemais") }) }
func ParsingSpec(c gospec.Context) { c.Specify("Whitespace is parsed properly.", func() { context := polish.MakeContext() polish.AddIntMathContext(context) res, err := context.Eval(" + 1 3") c.Assume(len(res), Equals, 1) c.Assume(err, Equals, nil) c.Expect(int(res[0].Int()), Equals, 4) }) }
// Helpers func NeighborSpecs(c gospec.Context) { c.Specify("[Neighbor] North neighbor", func() { value := Neighbor("dqcjq", [2]CardialDirections{North, None}) c.Expect(string(value), gospec.Equals, "dqcjw") }) c.Specify("[Neighbor] South West neighbor", func() { value := Neighbor("dqcjq", [2]CardialDirections{South, West}) c.Expect(string(value), gospec.Equals, "dqcjj") }) }
func MatrixIndexerSpec(c gospec.Context) { size := 100 usedIds := make(map[int]bool) nodesIds := make(map[VertexId]int) for i := 0; i < size; i++ { for j := 0; j < i; j++ { connId := matrixConnectionsIndexer(VertexId(i), VertexId(j), nodesIds, size, true) _, ok := usedIds[connId] c.Expect(ok, IsFalse) usedIds[connId] = true } } }
func FibSpec(c gospec.Context) { fib := NewFib().Sequence(10) c.Specify("The first two Fibonacci numbers are 0 and 1", func() { c.Expect(fib[0], Equals, 0) c.Expect(fib[1], Equals, 1) }) c.Specify("Each remaining number is the sum of the previous two", func() { for i := 2; i < len(fib); i++ { c.Expect(fib[i], Equals, fib[i-1]+fib[i-2]) } }) }
func DirectedGraphArcsFilterSpec(c gospec.Context) { gr := NewDirectedMap() gr.AddArc(1, 2) gr.AddArc(2, 3) gr.AddArc(3, 4) gr.AddArc(2, 4) gr.AddArc(4, 5) gr.AddArc(1, 6) gr.AddArc(2, 6) c.Specify("Single filtered arc", func() { ftail := VertexId(2) fhead := VertexId(3) f := NewDirectedGraphArcFilter(gr, ftail, fhead) c.Specify("shouldn't be checked", func() { c.Expect(f.CheckArc(ftail, fhead), IsFalse) }) c.Specify("shouldn't appear in accessors", func() { c.Expect(CollectVertexes(f.GetAccessors(VertexId(ftail))), Not(Contains), fhead) }) c.Specify("shouldn't appear in predecessors", func() { c.Expect(CollectVertexes(f.GetPredecessors(VertexId(fhead))), Not(Contains), ftail) }) c.Specify("shouldn't appear in iterator", func() { for conn := range f.ArcsIter() { c.Expect(conn.Tail == ftail && conn.Head == fhead, IsFalse) } }) }) }
func Mapper2Spec(c gospec.Context) { c.Specify("Map from []int to []float64", func() { a := []int{0, 1, 2, 3, 4} var b []float64 algorithm.Map2(a, &b, func(n int) float64 { return float64(n) }) c.Expect(b, ContainsInOrder, []float64{0, 1, 2, 3, 4}) }) // c.Specify("Map from []int to []string", func() { // a := []int{0,1,2,3,4} // var b []string // b = algorithm.Map(a, []string{}, func(v interface{}) interface{} { return fmt.Sprintf("%d", v) }).([]string) // c.Expect(b, ContainsInOrder, []string{"0", "1", "2", "3", "4"}) // }) }
func MapperSpec(c gospec.Context) { c.Specify("Map from []int to []float64", func() { a := []int{0, 1, 2, 3, 4} var b []float64 b = algorithm.Map(a, []float64{}, func(v interface{}) interface{} { return float64(v.(int)) }).([]float64) c.Expect(b, ContainsInOrder, []float64{0, 1, 2, 3, 4}) }) c.Specify("Map from []int to []string", func() { a := []int{0, 1, 2, 3, 4} var b []string b = algorithm.Map(a, []string{}, func(v interface{}) interface{} { return fmt.Sprintf("%d", v) }).([]string) c.Expect(b, ContainsInOrder, []string{"0", "1", "2", "3", "4"}) }) }
func ReachableDestinationsSpec(c gospec.Context) { b := [][]int{ []int{1, 2, 9, 4, 0, 2, 1}, // 0 - 6 []int{0, 0, 0, 0, 0, 1, 1}, // 7 - 13 []int{2, 1, 5, 5, 0, 2, 1}, // 14 - 20 []int{1, 1, 1, 9, 0, 1, 1}, // 21 - 27 } c.Specify("Check reachability", func() { reachable := algorithm.ReachableDestinations(board(b), []int{14}, []int{0, 2, 5, 13, 17, 22}) c.Expect(reachable, ContainsInOrder, []int{17, 22}) reachable = algorithm.ReachableDestinations(board(b), []int{1, 26}, []int{0, 2, 5, 13, 17, 22}) c.Expect(reachable, ContainsInOrder, []int{0, 2, 5, 13}) }) }
func Alloc3dSpec(c gospec.Context) { d100x20x10 := Alloc3d(100, 20, 10) c.Specify("Allocates the appropriate memory for 3d arrays.", func() { c.Expect(len(d100x20x10), gospec.Equals, 100) for _, v := range d100x20x10 { c.Expect(len(v), gospec.Equals, 20) for _, v := range v { c.Expect(len(v), gospec.Equals, 10) } } counter := 0.0 for i := range d100x20x10 { for j := range d100x20x10[i] { for k := range d100x20x10[i][j] { d100x20x10[i][j][k] = complex(counter, 0) counter += 1.0 } } } counter = 0.0 for i := range d100x20x10 { for j := range d100x20x10[i] { for k := range d100x20x10[i][j] { c.Expect(real(d100x20x10[i][j][k]), gospec.Equals, counter) counter += 1.0 } } } }) }
func UnorderedTypeRegistrySpec(c gospec.Context) { c.Specify("Test that the coder can decode packets out of order.", func() { var tr core.TypeRegistry tr.Register(encodable1{}) tr.Register(encodable2{}) tr.Complete() v1 := encodable1{1, 2} v2 := encodable2{3} v3 := encodable2{4} v4 := encodable1{5, 6} b1 := bytes.NewBuffer(nil) err := tr.Encode(v1, b1) c.Assume(err, gospec.Equals, error(nil)) b2 := bytes.NewBuffer(nil) err = tr.Encode(v2, b2) c.Assume(err, gospec.Equals, error(nil)) b3 := bytes.NewBuffer(nil) err = tr.Encode(v3, b3) c.Assume(err, gospec.Equals, error(nil)) b4 := bytes.NewBuffer(nil) err = tr.Encode(v4, b4) c.Assume(err, gospec.Equals, error(nil)) buf := bytes.NewBuffer(nil) buf.Write(b1.Bytes()) buf.Write(b3.Bytes()) buf.Write(b4.Bytes()) buf.Write(b2.Bytes()) d1, err := tr.Decode(buf) c.Assume(err, gospec.Equals, error(nil)) d3, err := tr.Decode(buf) c.Assume(err, gospec.Equals, error(nil)) d4, err := tr.Decode(buf) c.Assume(err, gospec.Equals, error(nil)) d2, err := tr.Decode(buf) c.Assume(err, gospec.Equals, error(nil)) c.Expect(d1, gospec.Equals, v1) c.Expect(d2, gospec.Equals, v2) c.Expect(d3, gospec.Equals, v3) c.Expect(d4, gospec.Equals, v4) }) }
func Float64ContextSpec(c gospec.Context) { c.Specify("Float64 context works properly.", func() { context := polish.MakeContext() polish.AddFloat64MathContext(context) v1 := math.E * math.Pi * math.Exp(1.23456-math.Log10(77)) res, err := context.Eval("* e * pi ^ e - 1.23456 log10 77.0") c.Assume(len(res), Equals, 1) c.Assume(err, Equals, nil) c.Expect(res[0].Float(), IsWithin(1e-9), v1) res, err = context.Eval("< e pi") c.Assume(len(res), Equals, 1) c.Assume(err, Equals, nil) c.Expect(res[0].Bool(), Equals, true) }) }
func CMWCSpec(c gospec.Context) { c.Specify("CMWC32 produces the same output as SlowCMWC.", func() { fast := core.MakeCMWC32(11, 4) slow := core.MakeSlowCMWC(11, 1<<32, 1<<4) N := 100000 for i := 0; i < N; i++ { f := fast.Next() s := slow.Next() c.Expect(f, Equals, s) if f != s { break } } }) }
func FFT3dSpec(c gospec.Context) { signal := Alloc3d(32, 16, 8) for i := range signal { for j := range signal[i] { for k := range signal[i][j] { signal[i][j][k] = complex(float64(i+j+k), float64(-i-j-k)) } } } forward := PlanDft3d(signal, signal, Forward, Estimate) c.Specify("Creating a plan doesn't overwrite an existing array if fftw.Estimate is used.", func() { for i := range signal { for j := range signal[i] { for k := range signal[i][j] { c.Expect(signal[i][j][k], gospec.Equals, complex(float64(i+j+k), float64(-i-j-k))) } } } }) // As long as fx < dx/2, fy < dy/2, and fz < dz/2, where dx,dy,dz are the lengths in // each dimension, there will be 2^n spikes, where n is the number of dimensions. // Each spike will be real and have magnitude equal to dx*dy*dz / 2^n dx := len(signal) fx := float64(dx) / 4 dy := len(signal[0]) fy := float64(dy) / 4 dz := len(signal[0][0]) fz := float64(dz) / 4 for i := range signal { for j := range signal[i] { for k := range signal[i][j] { cosx := math.Cos(float64(i) / float64(dx) * fx * math.Pi * 2) cosy := math.Cos(float64(j) / float64(dy) * fy * math.Pi * 2) cosz := math.Cos(float64(k) / float64(dz) * fz * math.Pi * 2) signal[i][j][k] = complex(cosx*cosy*cosz, 0) } } } forward.Execute() c.Specify("Forward 3d FFT works properly.", func() { for i := range signal { for j := range signal[i] { for k := range signal[i][j] { if (i == int(fx) || i == dx-int(fx)) && (j == int(fy) || j == dy-int(fy)) && (k == int(fz) || k == dz-int(fz)) { c.Expect(real(signal[i][j][k]), gospec.IsWithin(1e-7), float64(dx*dy*dz/8)) c.Expect(imag(signal[i][j][k]), gospec.IsWithin(1e-7), 0.0) } else { c.Expect(real(signal[i][j][k]), gospec.IsWithin(1e-7), 0.0) c.Expect(imag(signal[i][j][k]), gospec.IsWithin(1e-7), 0.0) } } } } }) }
// Helpers func RedisClientInterfaceSpecs(c gospec.Context) { c.Specify("[RedisClientInterface] RedisConnection satisfies RedisClientInterface", func() { connection := &RedisConnection{} // Wont' compile unless it implements the interface var redis_interface RedisClientInterface = connection c.Expect(redis_interface, gospec.Satisfies, true) }) c.Specify("[RedisClientInterface] redis.Client satisfies RedisClientInterface", func() { client := &redis.Client{} // Wont' compile unless it implements the interface var redis_interface RedisClientInterface = client c.Expect(redis_interface, gospec.Satisfies, true) }) }