public void CaretRangeComparator()
        {
            var comparator = SemanticVersionComparator.Parse("^1.2.3");

            Assert.True(comparator.Match("1.2.3"));
            Assert.False(comparator.Match("1.2.4-alpha"));
            Assert.True(comparator.Match("1.9.9"));
            Assert.False(comparator.Match("2.0.0"));
            Assert.False(comparator.Match("1.2.2"));

            comparator = SemanticVersionComparator.Parse("^ 0.2.3");
            Assert.True(comparator.Match("0.2.3"));
            Assert.False(comparator.Match("0.2.4-alpha"));
            Assert.True(comparator.Match("0.2.9"));
            Assert.False(comparator.Match("0.3.0"));
            Assert.False(comparator.Match("0.2.2"));

            comparator = SemanticVersionComparator.Parse("^0.0.3");
            Assert.True(comparator.Match("0.0.3"));
            Assert.False(comparator.Match("0.0.3-alpha"));
            Assert.False(comparator.Match("0.0.4-alpha"));
            Assert.False(comparator.Match("0.0.4"));
            Assert.False(comparator.Match("0.0.2"));

            comparator = SemanticVersionComparator.Parse("^1.2.3-beta.2");
            Assert.True(comparator.Match("1.2.3-beta.2"));
            Assert.False(comparator.Match("1.2.4-beta.2"));
            Assert.True(comparator.Match("1.9.9"));
            Assert.False(comparator.Match("2.0.0"));
            Assert.True(comparator.Match("1.2.3-beta.3"));
        }
        public void TildeRangeComparator()
        {
            var comparator = SemanticVersionComparator.Parse("~1.2.3");

            Assert.True(comparator.Match("1.2.3"));
            Assert.False(comparator.Match("1.2.3-alpha"));
            Assert.True(comparator.Match("1.2.9"));
            Assert.False(comparator.Match("1.3.0"));
            Assert.False(comparator.Match("1.2.2"));

            comparator = SemanticVersionComparator.Parse("~ 1.2");
            Assert.True(comparator.Match("1.2.0"));
            Assert.False(comparator.Match("1.2.0-alpha"));
            Assert.True(comparator.Match("1.2.9"));
            Assert.False(comparator.Match("1.3.0"));
            Assert.False(comparator.Match("1.1.9"));

            comparator = SemanticVersionComparator.Parse("~1");
            Assert.True(comparator.Match("1.0.0"));
            Assert.False(comparator.Match("1.0.0-alpha"));
            Assert.True(comparator.Match("1.9.9"));
            Assert.False(comparator.Match("2.0.0"));
            Assert.False(comparator.Match("0.9.9"));

            comparator = SemanticVersionComparator.Parse("~1.2.3-beta.2");
            Assert.True(comparator.Match("1.2.3-beta.2"));
            Assert.False(comparator.Match("1.2.4-beta.2"));
            Assert.True(comparator.Match("1.2.9"));
            Assert.False(comparator.Match("1.3.0"));
            Assert.True(comparator.Match("1.2.3-beta.3"));
        }
        public void ParenthesesComparator()
        {
            var comparator = SemanticVersionComparator.Parse("[ 1.2.3,2.0.1)");

            Assert.False(comparator.Match("1.2.2"));
            Assert.False(comparator.Match("2.0.1"));
            Assert.True(comparator.Match("1.2.3"));
            Assert.True(comparator.Match("2.0.0"));
            Assert.False(comparator.Match("2.0.0-alpha"));

            comparator = SemanticVersionComparator.Parse("[1.2.3 ,2.0.1-alpha.1)");
            Assert.False(comparator.Match("1.2.2"));
            Assert.False(comparator.Match("2.0.1"));
            Assert.True(comparator.Match("1.2.3"));
            Assert.True(comparator.Match("2.0.0"));
            Assert.False(comparator.Match("2.0.0-alpha"));
            Assert.True(comparator.Match("2.0.1-alpha"));

            comparator = SemanticVersionComparator.Parse(" [ 1.2.3-alpha.1 , 1.2.3-alpha.9 ) ");
            Assert.False(comparator.Match("1.2.3"));
            Assert.False(comparator.Match("1.2.2-alpha.1"));
            Assert.False(comparator.Match("1.2.4-alpha.1"));
            Assert.True(comparator.Match("1.2.3-alpha.1"));
            Assert.True(comparator.Match("1.2.3-alpha.8"));
            Assert.False(comparator.Match("1.2.3-alpha.9"));
        }
        public void IntersectSetComparator()
        {
            var comparator = SemanticVersionComparator.Parse(">=1.2.7 <1.3.0");

            Assert.True(comparator.Match("1.2.7"));
            Assert.True(comparator.Match("1.2.8"));
            Assert.True(comparator.Match("1.2.99"));
            Assert.False(comparator.Match("1.2.6"));
            Assert.False(comparator.Match("1.3.0"));
            Assert.False(comparator.Match("1.1.0"));

            comparator = SemanticVersionComparator.Parse(">=1.2.7 && <1.3.0");
            Assert.True(comparator.Match("1.2.7"));
            Assert.True(comparator.Match("1.2.8"));
            Assert.True(comparator.Match("1.2.99"));
            Assert.False(comparator.Match("1.2.6"));
            Assert.False(comparator.Match("1.3.0"));
            Assert.False(comparator.Match("1.1.0"));

            comparator = SemanticVersionComparator.Parse(">=1.2.7 & <1.3.0");
            Assert.True(comparator.Match("1.2.7"));
            Assert.True(comparator.Match("1.2.8"));
            Assert.True(comparator.Match("1.2.99"));
            Assert.False(comparator.Match("1.2.6"));
            Assert.False(comparator.Match("1.3.0"));
            Assert.False(comparator.Match("1.1.0"));

            comparator = SemanticVersionComparator.Parse(">=1.2.7 1.2.6 - 1.3.0");
            Assert.True(comparator.Match("1.2.7"));
            Assert.True(comparator.Match("1.2.8"));
            Assert.True(comparator.Match("1.2.99"));
            Assert.False(comparator.Match("1.2.6"));
            Assert.True(comparator.Match("1.3.0"));
            Assert.False(comparator.Match("1.1.0"));

            comparator = SemanticVersionComparator.Parse(">=1.2.7 [1.2.6 , 1.3.0)");
            Assert.True(comparator.Match("1.2.7"));
            Assert.True(comparator.Match("1.2.8"));
            Assert.True(comparator.Match("1.2.99"));
            Assert.False(comparator.Match("1.2.6"));
            Assert.False(comparator.Match("1.3.0"));
            Assert.False(comparator.Match("1.1.0"));

            comparator = SemanticVersionComparator.Parse(">=1.2.7 (1.2.6 , 1.3.0)");
            Assert.True(comparator.Match("1.2.7"));
            Assert.True(comparator.Match("1.2.8"));
            Assert.True(comparator.Match("1.2.99"));
            Assert.False(comparator.Match("1.2.6"));
            Assert.False(comparator.Match("1.3.0"));
            Assert.False(comparator.Match("1.1.0"));
        }
        public void HyphenRangeComparator()
        {
            var comparator = SemanticVersionComparator.Parse("1.2.3 - 2.3.4");

            Assert.True(comparator.Match("1.2.3"));
            Assert.False(comparator.Match("1.2.3-alpha.1"));
            Assert.False(comparator.Match("1.2.2"));
            Assert.True(comparator.Match("2.3.4"));
            Assert.False(comparator.Match("2.3.5"));
            Assert.False(comparator.Match("2.3.4-alpha.1"));

            comparator = SemanticVersionComparator.Parse("1.2 - 2.3");
            Assert.True(comparator.Match("1.2.0"));
            Assert.False(comparator.Match("1.2.0-alpha.1"));
            Assert.False(comparator.Match("1.1.9"));
            Assert.True(comparator.Match("2.3.9"));
            Assert.False(comparator.Match("2.3.9-alpha.1"));
            Assert.False(comparator.Match("2.4.0"));

            comparator = SemanticVersionComparator.Parse("1.2.3-alpha.1 - 2.3.4");
            Assert.True(comparator.Match("1.2.3-alpha.1"));
            Assert.True(comparator.Match("1.2.3-alpha.2"));
            Assert.True(comparator.Match("1.2.3"));
            Assert.False(comparator.Match("1.2.2"));
            Assert.False(comparator.Match("1.2.4-alpha.1"));
            Assert.False(comparator.Match("2.3.4-alpha.1"));
            Assert.True(comparator.Match("2.3.4"));
            Assert.False(comparator.Match("2.3.5"));

            comparator = SemanticVersionComparator.Parse("1.2.3 - 2.3.4-alpha.1");
            Assert.True(comparator.Match("1.2.3"));
            Assert.False(comparator.Match("1.2.3-alpha"));
            Assert.False(comparator.Match("1.2.2"));
            Assert.True(comparator.Match("2.3.4-alpha"));
            Assert.False(comparator.Match("2.3.3-alpha"));
            Assert.False(comparator.Match("2.3.5"));

            comparator = SemanticVersionComparator.Parse("1.2.3-alpha.1 - 2.3.4-alpha.1");
            Assert.True(comparator.Match("1.2.3-alpha.1"));
            Assert.True(comparator.Match("1.2.3-alpha.2"));
            Assert.True(comparator.Match("1.2.3"));
            Assert.False(comparator.Match("1.2.2"));
            Assert.False(comparator.Match("2.3.4"));
            Assert.False(comparator.Match("2.3.5"));
            Assert.True(comparator.Match("2.3.4-alpha.1"));
            Assert.True(comparator.Match("2.3.4-alpha"));
        }
        public void UnionSetComparator()
        {
            var comparator = SemanticVersionComparator.Parse("1.2.7 || >=1.2.9 <2.0.0");

            Assert.True(comparator.Match("1.2.7"));
            Assert.True(comparator.Match("1.2.9"));
            Assert.True(comparator.Match("1.4.6"));
            Assert.False(comparator.Match("1.2.8"));
            Assert.False(comparator.Match("2.0.0"));

            comparator = SemanticVersionComparator.Parse("1.2.7 | >=1.2.9 <2.0.0");
            Assert.True(comparator.Match("1.2.7"));
            Assert.True(comparator.Match("1.2.9"));
            Assert.True(comparator.Match("1.4.6"));
            Assert.False(comparator.Match("1.2.8"));
            Assert.False(comparator.Match("2.0.0"));
        }
        public void NotEqualToPrimitiveComparator()
        {
            var comparator = SemanticVersionComparator.Parse("!=1.2.3");

            Assert.False(comparator.Match("1.2.3"));
            Assert.True(comparator.Match("1.2.4"));
            Assert.True(comparator.Match("1.2.3-alpha"));

            comparator = SemanticVersionComparator.Parse("<>1.2.x");
            Assert.True(comparator.Match("1.3.0"));
            Assert.False(comparator.Match("1.2.9"));
            Assert.True(comparator.Match("1.2.9-alpha"));

            comparator = SemanticVersionComparator.Parse("!=1.2.3-alpha.1");
            Assert.True(comparator.Match("1.2.3"));
            Assert.False(comparator.Match("1.2.3-alpha.1"));
            Assert.True(comparator.Match("1.2.2"));
        }
        public void ParseAnyComparator()
        {
            var comparator = SemanticVersionComparator.Parse("");

            Assert.True(comparator.Match("1.0.0"));
            Assert.True(comparator.Match("2.0.0"));

            comparator = SemanticVersionComparator.Parse(" ");
            Assert.True(comparator.Match("1.0.0"));
            Assert.True(comparator.Match("2.0.0"));

            comparator = SemanticVersionComparator.Parse("*");
            Assert.True(comparator.Match("1.0.0"));
            Assert.True(comparator.Match("2.0.0"));

            comparator = SemanticVersionComparator.Parse(" * ");
            Assert.True(comparator.Match("1.0.0"));
            Assert.True(comparator.Match("2.0.0"));
        }
        public void GreaterThanPrimitiveComparator()
        {
            var comparator = SemanticVersionComparator.Parse(">1.2.3");

            Assert.False(comparator.Match("1.2.3"));
            Assert.True(comparator.Match("1.2.4"));
            Assert.False(comparator.Match("1.2.4-alpha"));

            comparator = SemanticVersionComparator.Parse(">1.2.x");
            Assert.False(comparator.Match("1.2.0"));
            Assert.True(comparator.Match("1.2.4"));
            Assert.False(comparator.Match("1.2.4-alpha"));

            comparator = SemanticVersionComparator.Parse(">1.2.3-alpha.1");
            Assert.True(comparator.Match("1.2.3"));
            Assert.True(comparator.Match("1.2.3-alpha.2"));
            Assert.True(comparator.Match("1.2.4"));
            Assert.False(comparator.Match("1.2.4-alpha.2"));
        }
        public void SimpleComparatorTest()
        {
            var comparator = SemanticVersionComparator.Parse("1.2.x");

            Assert.False(comparator.Match("1.1.9"));
            Assert.True(comparator.Match("1.2.0"));
            Assert.False(comparator.Match("1.2.0-alpha"));
            Assert.False(comparator.Match("1.3.0"));

            comparator = SemanticVersionComparator.Parse("1.2");
            Assert.False(comparator.Match("1.1.9"));
            Assert.True(comparator.Match("1.2.0"));
            Assert.False(comparator.Match("1.2.0-alpha"));
            Assert.False(comparator.Match("1.3.0"));

            comparator = SemanticVersionComparator.Parse("1.2.3");
            Assert.True(comparator.Match("1.2.3"));
            Assert.False(comparator.Match("1.2.3-alpha"));
        }
        public void LessThanPrimitiveComparator()
        {
            var comparator = SemanticVersionComparator.Parse("<1.2.3");

            Assert.False(comparator.Match("1.2.3"));
            Assert.False(comparator.Match("1.2.4"));
            Assert.False(comparator.Match("1.2.3-alpha"));
            Assert.True(comparator.Match("1.2.2"));
            Assert.False(comparator.Match("1.2.2-alpha"));

            comparator = SemanticVersionComparator.Parse("<1.2.x");
            Assert.False(comparator.Match("1.3.0"));
            Assert.True(comparator.Match("1.2.9"));
            Assert.False(comparator.Match("1.2.9-alpha"));
            Assert.True(comparator.Match("1.1.9"));
            Assert.False(comparator.Match("1.1.9-alpha"));

            comparator = SemanticVersionComparator.Parse("<1.2.3-alpha.1");
            Assert.False(comparator.Match("1.2.3"));
            Assert.True(comparator.Match("1.2.3-alpha"));
            Assert.True(comparator.Match("1.2.2"));
            Assert.False(comparator.Match("1.2.2-alpha.2"));
        }