diff --git a/client/orm/orm_test.go b/client/orm/orm_test.go index 565f6c60..8bea63d9 100644 --- a/client/orm/orm_test.go +++ b/client/orm/orm_test.go @@ -2668,3 +2668,45 @@ func TestPSQueryBuilder(t *testing.T) { throwFailNow(t, AssertIs(l[0].UserName, "astaxie")) throwFailNow(t, AssertIs(l[0].Age, 30)) } + +func TestCondition(t *testing.T) { + // test Condition whether to include yourself + cond := NewCondition() + cond = cond.AndCond(cond.Or("id", 1)) + cond = cond.AndCond(cond.Or("id", 2)) + cond = cond.AndCond(cond.Or("id", 3)) + cond = cond.AndCond(cond.Or("id", 4)) + + cycleFlag := false + var hasCycle func(*Condition) + hasCycle = func(c *Condition) { + if nil == c || cycleFlag { + return + } + condPointMap := make(map[string]bool) + condPointMap[fmt.Sprintf("%p", c)] = true + for _, p := range c.params { + if p.isCond { + adr := fmt.Sprintf("%p", p.cond) + if condPointMap[adr] { + // self as sub cond was cycle + cycleFlag = true + return + } else { + condPointMap[adr] = true + } + } + } + for _, p := range c.params { + if p.isCond { + // check next cond + hasCycle(p.cond) + } + } + return + } + hasCycle(cond) + // cycleFlag was true,meaning use self as sub cond + throwFail(t, AssertIs(!cycleFlag, true)) + return +}