@@ -226,6 +226,138 @@ func TestSelect(t *testing.T) {
226226 })
227227}
228228
229+ type bar struct {
230+ str string
231+ foos []foo
232+ }
233+ type fooBar struct {
234+ fooStr string
235+ barStr string
236+ }
237+
238+ var (
239+ fooArr = []foo {foo {"A" , 0 }, foo {"B" , 1 }, foo {"C" , - 1 }}
240+ barArr = []bar {bar {"a" , []foo {foo {"A" , 0 }, foo {"B" , 1 }}}, bar {"b" , []foo {foo {"C" , - 1 }}}}
241+ fooEmpty = []bar {bar {"c" , nil }}
242+ fooBarArr = []fooBar {fooBar {"A" , "a" }, fooBar {"B" , "a" }, fooBar {"C" , "b" }}
243+ )
244+
245+ func TestSelectMany (t * testing.T ) {
246+ children := func (i T , x int ) (T , error ) {
247+ return i .(bar ).foos , nil
248+ }
249+ erroneusFunc := func (i T , x int ) (T , error ) {
250+ return nil , errFoo
251+ }
252+
253+ c .Convey ("Previous error is reflected on result" , t , func () {
254+ _ , err := From (barArr ).Where (erroneusBinaryFunc ).SelectMany (children ).Results ()
255+ c .So (err , c .ShouldNotEqual , nil )
256+ })
257+
258+ c .Convey ("Nil func returns error" , t , func () {
259+ _ , err := From (barArr ).SelectMany (nil ).Results ()
260+ c .So (err , c .ShouldEqual , ErrNilFunc )
261+ })
262+
263+ c .Convey ("Error returned from provided func" , t , func () {
264+ val , err := From (barArr ).SelectMany (erroneusFunc ).Results ()
265+ c .So (err , c .ShouldNotEqual , nil )
266+
267+ c .Convey ("Erroneus function is in chain with as-is select" , func () {
268+ _ , err = From (barArr ).SelectMany (children ).SelectMany (erroneusFunc ).Results ()
269+ c .So (err , c .ShouldNotEqual , nil )
270+ })
271+ c .Convey ("Erroneus function is in chain but not called" , func () {
272+ val , err = From (barArr ).Where (alwaysFalse ).SelectMany (erroneusFunc ).Results ()
273+ c .So (err , c .ShouldEqual , nil )
274+ c .So (len (val ), c .ShouldEqual , 0 )
275+ })
276+
277+ })
278+
279+ c .Convey ("Select empty as is" , t , func () {
280+ val , err := From (fooEmpty ).SelectMany (children ).Results ()
281+ c .So (err , c .ShouldEqual , nil )
282+ c .So (val , shouldSlicesResemble , empty )
283+ })
284+
285+ c .Convey ("Select all elements as is" , t , func () {
286+ val , err := From (barArr ).SelectMany (children ).Results ()
287+ c .So (err , c .ShouldEqual , nil )
288+ c .So (val , shouldSlicesResemble , fooArr )
289+ })
290+ }
291+
292+ func TestSelectManyBy (t * testing.T ) {
293+ children := func (b T , x int ) (T , error ) {
294+ return b .(bar ).foos , nil
295+ }
296+ barStr := func (b T , f T ) (T , error ) {
297+ return fooBar {f .(foo ).str , b .(bar ).str }, nil
298+ }
299+ erroneusFunc := func (b T , x int ) (T , error ) {
300+ return nil , errFoo
301+ }
302+ erroneusSelectFunc := func (b T , f T ) (T , error ) {
303+ return nil , errFoo
304+ }
305+
306+ c .Convey ("Previous error is reflected on result" , t , func () {
307+ _ , err := From (barArr ).Where (erroneusBinaryFunc ).SelectManyBy (children , barStr ).Results ()
308+ c .So (err , c .ShouldNotEqual , nil )
309+ })
310+
311+ c .Convey ("Nil transform func returns error" , t , func () {
312+ _ , err := From (barArr ).SelectManyBy (nil , barStr ).Results ()
313+ c .So (err , c .ShouldEqual , ErrNilFunc )
314+ })
315+
316+ c .Convey ("Nil resultSelect func returns error" , t , func () {
317+ _ , err := From (barArr ).SelectManyBy (children , nil ).Results ()
318+ c .So (err , c .ShouldEqual , ErrNilFunc )
319+ })
320+
321+ c .Convey ("Both nil func returns error" , t , func () {
322+ _ , err := From (barArr ).SelectManyBy (nil , nil ).Results ()
323+ c .So (err , c .ShouldEqual , ErrNilFunc )
324+ })
325+
326+ c .Convey ("Error returned from provided func" , t , func () {
327+ val , err := From (barArr ).SelectManyBy (erroneusFunc , barStr ).Results ()
328+ c .So (err , c .ShouldNotEqual , nil )
329+
330+ val , err = From (barArr ).SelectManyBy (children , erroneusSelectFunc ).Results ()
331+ c .So (err , c .ShouldNotEqual , nil )
332+
333+ val , err = From (barArr ).SelectManyBy (erroneusFunc , erroneusSelectFunc ).Results ()
334+ c .So (err , c .ShouldNotEqual , nil )
335+
336+ c .Convey ("Erroneus function is in chain with as-is select" , func () {
337+ _ , err = From (barArr ).SelectManyBy (children , barStr ).SelectManyBy (erroneusFunc , erroneusSelectFunc ).Results ()
338+ c .So (err , c .ShouldNotEqual , nil )
339+ })
340+ c .Convey ("Erroneus function is in chain but not called" , func () {
341+ val , err = From (barArr ).Where (alwaysFalse ).SelectManyBy (erroneusFunc , erroneusSelectFunc ).Results ()
342+ c .So (err , c .ShouldEqual , nil )
343+ c .So (len (val ), c .ShouldEqual , 0 )
344+ })
345+
346+ })
347+
348+ c .Convey ("Select empty as is" , t , func () {
349+ val , err := From (fooEmpty ).SelectManyBy (children , barStr ).Results ()
350+ c .So (err , c .ShouldEqual , nil )
351+ c .So (val , shouldSlicesResemble , empty )
352+ })
353+
354+ c .Convey ("Select all elements as is" , t , func () {
355+ val , err := From (barArr ).SelectManyBy (children , barStr ).Results ()
356+ c .So (err , c .ShouldEqual , nil )
357+ c .So (val , shouldSlicesResemble , fooBarArr )
358+ })
359+ }
360+
229361func TestDistinct (t * testing.T ) {
230362 c .Convey ("Empty slice" , t , func () {
231363 res , err := From (empty ).Distinct ().Results ()
0 commit comments