From 647e21b0c401833c3cbf5143e072c07bb195894f Mon Sep 17 00:00:00 2001 From: cruis Date: Fri, 13 Nov 2020 00:13:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Condition=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/orm/orm_test.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) 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 +}