Fix more pre-release constraint bugs (#26)

I hadn't thought to test version ranges with max pre-release
constraints, but they turn out to be relevant in some situations.

Closes #20
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0246edd..f2e5e62 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+# 1.3.7
+
+* Fix more bugs with `VersionRange.intersect()`, `VersionRange.difference()`,
+  and `VersionRange.union()` involving version ranges with pre-release maximums.
+
 # 1.3.6
 
 * Fix a bug where constraints that only allowed pre-release versions would be
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index d793e7a..adc1fae 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -32,10 +32,12 @@
   if (range1.max == null) return range2.max != null;
   if (range2.max == null) return false;
 
-  // `<1.0.0-dev.1` allows `1.0.0-dev.0` which is higher than any versions
-  // allowed by `<1.0.0`.
+  // `<1.0.0-dev.1` allows higher versions than `<1.0.0`, such as `1.0.0-dev.0`.
   if (disallowedByPreRelease(range2, range1.max)) return true;
 
+  // `<1.0.0` doesn't allow any versions higher than `<1.0.0-dev`.
+  if (disallowedByPreRelease(range1, range2.max)) return false;
+
   var comparison = range1.max.compareTo(range2.max);
   if (comparison == 1) return true;
   if (comparison == -1) return false;
@@ -46,8 +48,12 @@
 /// [range2].
 bool strictlyLower(VersionRange range1, VersionRange range2) {
   if (range1.max == null || range2.min == null) return false;
+
+  // `<1.0.0` doesn't allow any versions allowed by `>=1.0.0-dev.0`.
   if (disallowedByPreRelease(range1, range2.min)) return true;
 
+  //if (disallowedByPreRelease(range2, range1.min)) return true;
+
   var comparison = range1.max.compareTo(range2.min);
   if (comparison == -1) return true;
   if (comparison == 1) return false;
diff --git a/lib/src/version_range.dart b/lib/src/version_range.dart
index ae19002..ec15de4 100644
--- a/lib/src/version_range.dart
+++ b/lib/src/version_range.dart
@@ -215,29 +215,24 @@
         return new VersionConstraint.unionOf([this, other]);
       }
 
-      var unionMin = min;
-      var unionIncludeMin = includeMin;
-      var unionMax = max;
-      var unionIncludeMax = includeMax;
-
-      if (unionMin == null) {
-        // Do nothing.
-      } else if (other.min == null || other.min < min) {
+      Version unionMin;
+      bool unionIncludeMin;
+      if (allowsLower(this, other)) {
+        unionMin = this.min;
+        unionIncludeMin = this.includeMin;
+      } else {
         unionMin = other.min;
         unionIncludeMin = other.includeMin;
-      } else if (min == other.min && other.includeMin) {
-        // If the edges are the same but one is inclusive, make it inclusive.
-        unionIncludeMin = true;
       }
 
-      if (unionMax == null) {
-        // Do nothing.
-      } else if (other.max == null || other.max > max) {
+      Version unionMax;
+      bool unionIncludeMax;
+      if (allowsHigher(this, other)) {
+        unionMax = this.max;
+        unionIncludeMax = this.includeMax;
+      } else {
         unionMax = other.max;
         unionIncludeMax = other.includeMax;
-      } else if (max == other.max && other.includeMax) {
-        // If the edges are the same but one is inclusive, make it inclusive.
-        unionIncludeMax = true;
       }
 
       return new VersionRange(
diff --git a/pubspec.yaml b/pubspec.yaml
index 1b0beb8..1b738d7 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: pub_semver
-version: 1.3.6
+version: 1.3.7
 author: Dart Team <misc@dartlang.org>
 description: >
  Versions and version constraints implementing pub's versioning policy. This
diff --git a/test/version_range_test.dart b/test/version_range_test.dart
index 2c311f5..63cf302 100644
--- a/test/version_range_test.dart
+++ b/test/version_range_test.dart
@@ -469,6 +469,13 @@
               .intersect(new VersionConstraint.parse(">=2.0.0-dev")),
           equals(VersionConstraint.empty));
     });
+
+    test("with a range with a pre-release max, returns the original", () {
+      expect(
+          new VersionRange(max: v200)
+              .intersect(new VersionConstraint.parse("<2.0.0-dev")),
+          equals(new VersionRange(max: v200)));
+    });
   });
 
   group('union()', () {
@@ -558,6 +565,14 @@
       expect(result, allows(new Version.parse("2.0.0-dev.1")));
       expect(result, allows(new Version.parse("2.0.0")));
     });
+
+    test("with a range with a pre-release max, returns the larger constraint",
+        () {
+      expect(
+          new VersionRange(max: v200)
+              .union(new VersionConstraint.parse("<2.0.0-dev")),
+          equals(new VersionConstraint.parse("<2.0.0-dev")));
+    });
   });
 
   group('difference()', () {
@@ -730,6 +745,13 @@
               .difference(new VersionConstraint.parse(">=2.0.0-dev")),
           equals(new VersionRange(max: v200)));
     });
+
+    test("with a range with a pre-release max, returns null", () {
+      expect(
+          new VersionRange(max: v200)
+              .difference(new VersionConstraint.parse("<2.0.0-dev")),
+          equals(VersionConstraint.empty));
+    });
   });
 
   test('isEmpty', () {