@@ -69,6 +69,86 @@ void main() {
6969 failParse ('WhiteSpace 2' , '1 .1' );
7070 failParse ('WhiteSpace 3' , '1. 1' );
7171 failParse ('WhiteSpace 4' , '1.1 ' );
72+
73+ test ('compareTo valid' , () {
74+ var version = LanguageVersion (3 , 5 );
75+
76+ for (var (otherVersion, matcher) in [
77+ (version, isZero), // Identical.
78+ (LanguageVersion (3 , 5 ), isZero), // Same major, same minor.
79+ (LanguageVersion (3 , 4 ), isPositive), // Same major, lower minor.
80+ (LanguageVersion (3 , 6 ), isNegative), // Same major, greater minor.
81+ (LanguageVersion (2 , 5 ), isPositive), // Lower major, same minor.
82+ (LanguageVersion (2 , 4 ), isPositive), // Lower major, lower minor.
83+ (LanguageVersion (2 , 6 ), isPositive), // Lower major, greater minor.
84+ (LanguageVersion (4 , 5 ), isNegative), // Greater major, same minor.
85+ (LanguageVersion (4 , 4 ), isNegative), // Greater major, lower minor.
86+ (LanguageVersion (4 , 6 ), isNegative), // Greater major, greater minor.
87+ ]) {
88+ expect (version.compareTo (otherVersion), matcher);
89+ }
90+ });
91+
92+ test ('compareTo invalid' , () {
93+ var validVersion = LanguageVersion (3 , 5 );
94+ var invalidVersion = LanguageVersion .parse ('' , onError: (_) {});
95+
96+ expect (validVersion.compareTo (invalidVersion), isPositive);
97+ expect (invalidVersion.compareTo (validVersion), isNegative);
98+ });
99+
100+ test ('relational valid' , () {
101+ /// Test that the relational comparisons between two valid versions
102+ /// match the results of `compareTo` .
103+ void testComparisons (
104+ LanguageVersion version, LanguageVersion otherVersion) {
105+ expect (version == otherVersion, version.compareTo (otherVersion) == 0 );
106+
107+ expect (version < otherVersion, version.compareTo (otherVersion) < 0 );
108+ expect (version <= otherVersion, version.compareTo (otherVersion) <= 0 );
109+
110+ expect (version > otherVersion, version.compareTo (otherVersion) > 0 );
111+ expect (version >= otherVersion, version.compareTo (otherVersion) >= 0 );
112+ }
113+
114+ var version = LanguageVersion (3 , 5 );
115+
116+ // Check relational comparisons of a version to itself.
117+ testComparisons (version, version);
118+
119+ // Check relational comparisons of a version to versions with all
120+ // possible combinations of minor and major versions that are
121+ // the same, lower, and greater.
122+ for (final major in [2 , 3 , 4 ]) {
123+ for (final minor in [4 , 5 , 6 ]) {
124+ testComparisons (version, LanguageVersion (major, minor));
125+ }
126+ }
127+ });
128+
129+ test ('relational invalid' , () {
130+ void testComparisonsWithInvalid (
131+ LanguageVersion version,
132+ LanguageVersion otherVersion,
133+ ) {
134+ expect (version == otherVersion, identical (version, otherVersion));
135+
136+ expect (() => version < otherVersion, throwsA (isA <StateError >()));
137+ expect (() => version <= otherVersion, throwsA (isA <StateError >()));
138+
139+ expect (() => version > otherVersion, throwsA (isA <StateError >()));
140+ expect (() => version >= otherVersion, throwsA (isA <StateError >()));
141+ }
142+
143+ var validVersion = LanguageVersion (3 , 5 );
144+ var invalidVersion = LanguageVersion .parse ('' , onError: (_) {});
145+ var differentInvalidVersion = LanguageVersion .parse ('-' , onError: (_) {});
146+
147+ testComparisonsWithInvalid (validVersion, invalidVersion);
148+ testComparisonsWithInvalid (invalidVersion, validVersion);
149+ testComparisonsWithInvalid (invalidVersion, invalidVersion);
150+ testComparisonsWithInvalid (invalidVersion, differentInvalidVersion);
151+ });
72152 });
73153
74154 group ('Package' , () {
0 commit comments