aboutsummaryrefslogtreecommitdiffstats
path: root/test/libsolidity/SemVerMatcher.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/libsolidity/SemVerMatcher.cpp')
-rw-r--r--test/libsolidity/SemVerMatcher.cpp223
1 files changed, 223 insertions, 0 deletions
diff --git a/test/libsolidity/SemVerMatcher.cpp b/test/libsolidity/SemVerMatcher.cpp
new file mode 100644
index 00000000..80bdf16f
--- /dev/null
+++ b/test/libsolidity/SemVerMatcher.cpp
@@ -0,0 +1,223 @@
+/*
+ This file is part of cpp-ethereum.
+
+ cpp-ethereum is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ cpp-ethereum is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * @author Christian <chris@ethereum.org>
+ * @date 2016
+ * Unit tests for the semantic versioning matcher.
+ */
+
+#include <string>
+#include <vector>
+#include <tuple>
+#include <libsolidity/parsing/Scanner.h>
+#include <libsolidity/analysis/SemVerHandler.h>
+#include "../TestHelper.h"
+
+using namespace std;
+
+namespace dev
+{
+namespace solidity
+{
+namespace test
+{
+
+BOOST_AUTO_TEST_SUITE(SemVerMatcher)
+
+SemVerMatchExpression parseExpression(string const& _input)
+{
+ Scanner scanner{CharStream(_input)};
+ vector<string> literals;
+ vector<Token::Value> tokens;
+ while (scanner.currentToken() != Token::EOS)
+ {
+ auto token = scanner.currentToken();
+ string literal = scanner.currentLiteral();
+ if (literal.empty() && Token::toString(token))
+ literal = Token::toString(token);
+ literals.push_back(literal);
+ tokens.push_back(token);
+ scanner.next();
+ }
+
+ auto expression = SemVerMatchExpressionParser(tokens, literals).parse();
+ BOOST_CHECK_MESSAGE(
+ expression.isValid(),
+ "Expression \"" + _input + "\" did not parse properly."
+ );
+ return expression;
+}
+
+BOOST_AUTO_TEST_CASE(positive_range)
+{
+ // Positive range tests
+ vector<pair<string, string>> tests = {
+ {"*", "1.2.3-foo"},
+ {"1.0.0 - 2.0.0", "1.2.3"},
+ {"1.0.0", "1.0.0"},
+ {">=*", "0.2.4"},
+ {"*", "1.2.3"},
+ {">=1.0.0", "1.0.0"},
+ {">=1.0.0", "1.0.1"},
+ {">=1.0.0", "1.1.0"},
+ {">1.0.0", "1.0.1"},
+ {">1.0.0", "1.1.0"},
+ {"<=2.0.0", "2.0.0"},
+ {"<=2.0.0", "1.9999.9999"},
+ {"<=2.0.0", "0.2.9"},
+ {"<2.0.0", "1.9999.9999"},
+ {"<2.0.0", "0.2.9"},
+ {">= 1.0.0", "1.0.0"},
+ {">= 1.0.0", "1.0.1"},
+ {">= 1.0.0", "1.1.0"},
+ {"> 1.0.0", "1.0.1"},
+ {"> 1.0.0", "1.1.0"},
+ {"<= 2.0.0", "2.0.0"},
+ {"<= 2.0.0", "1.9999.9999"},
+ {"<= 2.0.0", "0.2.9"},
+ {"< 2.0.0", "1.9999.9999"},
+ {"<\t2.0.0", "0.2.9"},
+ {">=0.1.97", "0.1.97"},
+ {"0.1.20 || 1.2.4", "1.2.4"},
+ {">=0.2.3 || <0.0.1", "0.0.0"},
+ {">=0.2.3 || <0.0.1", "0.2.3"},
+ {">=0.2.3 || <0.0.1", "0.2.4"},
+ {"\"2.x.x\"", "2.1.3"},
+ {"1.2.x", "1.2.3"},
+ {"\"1.2.x\" || \"2.x\"", "2.1.3"},
+ {"\"1.2.x\" || \"2.x\"", "1.2.3"},
+ {"x", "1.2.3"},
+ {"2.*.*", "2.1.3"},
+ {"1.2.*", "1.2.3"},
+ {"1.2.* || 2.*", "2.1.3"},
+ {"1.2.* || 2.*", "1.2.3"},
+ {"*", "1.2.3"},
+ {"2", "2.1.2"},
+ {"2.3", "2.3.1"},
+ {"~2.4", "2.4.0"}, // >=2.4.0 <2.5.0
+ {"~2.4", "2.4.5"},
+ {"~1", "1.2.3"}, // >=1.0.0 <2.0.0
+ {"~1.0", "1.0.2"}, // >=1.0.0 <1.1.0,
+ {"~ 1.0", "1.0.2"},
+ {"~ 1.0.3", "1.0.12"},
+ {">=1", "1.0.0"},
+ {">= 1", "1.0.0"},
+ {"<1.2", "1.1.1"},
+ {"< 1.2", "1.1.1"},
+ {"=0.7.x", "0.7.2"},
+ {"<=0.7.x", "0.7.2"},
+ {">=0.7.x", "0.7.2"},
+ {"<=0.7.x", "0.6.2"},
+ {"~1.2.1 >=1.2.3", "1.2.3"},
+ {"~1.2.1 =1.2.3", "1.2.3"},
+ {"~1.2.1 1.2.3", "1.2.3"},
+ {"~1.2.1 >=1.2.3 1.2.3", "1.2.3"},
+ {"~1.2.1 1.2.3 >=1.2.3", "1.2.3"},
+ {">=\"1.2.1\" 1.2.3", "1.2.3"},
+ {"1.2.3 >=1.2.1", "1.2.3"},
+ {">=1.2.3 >=1.2.1", "1.2.3"},
+ {">=1.2.1 >=1.2.3", "1.2.3"},
+ {">=1.2", "1.2.8"},
+ {"^1.2.3", "1.8.1"},
+ {"^0.1.2", "0.1.2"},
+ {"^0.1", "0.1.2"},
+ {"^1.2", "1.4.2"},
+ {"<=1.2.3", "1.2.3-beta"},
+ {">1.2", "1.3.0-beta"},
+ {"<1.2.3", "1.2.3-beta"},
+ {"^1.2 ^1", "1.4.2"}
+ };
+ for (auto const& t: tests)
+ {
+ SemVerVersion version(t.second);
+ SemVerMatchExpression expression = parseExpression(t.first);
+ BOOST_CHECK_MESSAGE(
+ expression.matches(version),
+ "Version \"" + t.second + "\" did not satisfy expression \"" + t.first + "\""
+ );
+ }
+}
+
+BOOST_AUTO_TEST_CASE(negative_range)
+{
+ // Positive range tests
+ vector<pair<string, string>> tests = {
+ {"1.0.0 - 2.0.0", "2.2.3"},
+ {"^1.2.3", "1.2.3-pre"},
+ {"^1.2", "1.2.0-pre"},
+ {"^1.2.3", "1.2.3-beta"},
+ {"=0.7.x", "0.7.0-asdf"},
+ {">=0.7.x", "0.7.0-asdf"},
+ {"1.0.0", "1.0.1"},
+ {">=1.0.0", "0.0.0"},
+ {">=1.0.0", "0.0.1"},
+ {">=1.0.0", "0.1.0"},
+ {">1.0.0", "0.0.1"},
+ {">1.0.0", "0.1.0"},
+ {"<=2.0.0", "3.0.0"},
+ {"<=2.0.0", "2.9999.9999"},
+ {"<=2.0.0", "2.2.9"},
+ {"<2.0.0", "2.9999.9999"},
+ {"<2.0.0", "2.2.9"},
+ {">=0.1.97", "0.1.93"},
+ {"0.1.20 || 1.2.4", "1.2.3"},
+ {">=0.2.3 || <0.0.1", "0.0.3"},
+ {">=0.2.3 || <0.0.1", "0.2.2"},
+ {"\"2.x.x\"", "1.1.3"},
+ {"\"2.x.x\"", "3.1.3"},
+ {"1.2.x", "1.3.3"},
+ {"\"1.2.x\" || \"2.x\"", "3.1.3"},
+ {"\"1.2.x\" || \"2.x\"", "1.1.3"},
+ {"2.*.*", "1.1.3"},
+ {"2.*.*", "3.1.3"},
+ {"1.2.*", "1.3.3"},
+ {"1.2.* || 2.*", "3.1.3"},
+ {"1.2.* || 2.*", "1.1.3"},
+ {"2", "1.1.2"},
+ {"2.3", "2.4.1"},
+ {"~2.4", "2.5.0"}, // >=2.4.0 <2.5.0
+ {"~2.4", "2.3.9"},
+ {"~1", "0.2.3"}, // >=1.0.0 <2.0.0
+ {"~1.0", "1.1.0"}, // >=1.0.0 <1.1.0
+ {"<1", "1.0.0"},
+ {">=1.2", "1.1.1"},
+ {"=0.7.x", "0.8.2"},
+ {">=0.7.x", "0.6.2"},
+ {"<0.7.x", "0.7.2"},
+ {"=1.2.3", "1.2.3-beta"},
+ {">1.2", "1.2.8"},
+ {"^1.2.3", "2.0.0-alpha"},
+ {"^1.2.3", "1.2.2"},
+ {"^1.2", "1.1.9"}
+ };
+ for (auto const& t: tests)
+ {
+ SemVerVersion version(t.second);
+ SemVerMatchExpression expression = parseExpression(t.first);
+ BOOST_CHECK_MESSAGE(
+ !expression.matches(version),
+ "Version \"" + t.second + "\" did satisfy expression \"" + t.first + "\" " +
+ "(although it should not)"
+ );
+ }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+}
+}
+} // end namespaces