rangeOpLTE
rangeOpGT
rangeOpGTE
+ rangeOpEQ
+ rangeOpNE
)
func cutRangeOp(s string) (op int, rest string) {
return rangeOpGTE, s[3:]
case strings.HasPrefix(s, "<= "):
return rangeOpLTE, s[3:]
+ case strings.HasPrefix(s, "== "):
+ return rangeOpEQ, s[3:]
+ case strings.HasPrefix(s, "!= "):
+ return rangeOpNE, s[3:]
case strings.HasPrefix(s, "> "):
return rangeOpGT, s[2:]
case strings.HasPrefix(s, "< "):
p = p.And(func(s IndexString) Match {
return BoolMatch(s.Index >= i)
})
+ case rangeOpEQ:
+ p = p.And(func(s IndexString) Match {
+ return BoolMatch(s.Index == i)
+ })
+ case rangeOpNE:
+ p = p.And(func(s IndexString) Match {
+ return BoolMatch(s.Index != i)
+ })
}
} else {
g, err := getGlob(pattern)
m = n(">= v99.0.0")
c.Assert(m(is(0)), qt.IsFalse)
c.Assert(m(is(3)), qt.IsFalse)
+
+ // Test == v2.0.0: should only match v2.0.0
+ m = n("== v2.0.0")
+ c.Assert(m(is(0)), qt.IsFalse) // v4.0.0
+ c.Assert(m(is(1)), qt.IsFalse) // v3.0.0
+ c.Assert(m(is(2)), qt.IsTrue) // v2.0.0
+ c.Assert(m(is(3)), qt.IsFalse) // v1.0.0
+
+ // Test != v2.0.0: should match everything except v2.0.0
+ m = n("!= v2.0.0")
+ c.Assert(m(is(0)), qt.IsTrue) // v4.0.0
+ c.Assert(m(is(1)), qt.IsTrue) // v3.0.0
+ c.Assert(m(is(2)), qt.IsFalse) // v2.0.0
+ c.Assert(m(is(3)), qt.IsTrue) // v1.0.0
+
+ // Test != with range: >= v2.0.0 AND != v3.0.0
+ m = n(">= v2.0.0", "!= v3.0.0")
+ c.Assert(m(is(0)), qt.IsTrue) // v4.0.0
+ c.Assert(m(is(1)), qt.IsFalse) // v3.0.0 - excluded by !=
+ c.Assert(m(is(2)), qt.IsTrue) // v2.0.0
+ c.Assert(m(is(3)), qt.IsFalse) // v1.0.0 - out of range
}
func BenchmarkPredicate(b *testing.B) {
c.Assert(op, qt.Equals, rangeOpLT)
c.Assert(rest, qt.Equals, "value")
+ op, rest = cutRangeOp("== value")
+ c.Assert(op, qt.Equals, rangeOpEQ)
+ c.Assert(rest, qt.Equals, "value")
+
+ op, rest = cutRangeOp("!= value")
+ c.Assert(op, qt.Equals, rangeOpNE)
+ c.Assert(rest, qt.Equals, "value")
+
op, rest = cutRangeOp("value")
c.Assert(op, qt.Equals, rangeOpNone)
c.Assert(rest, qt.Equals, "value")