Changes related to the order of Skylark dictionaries:
- Objects of different types can now be compared.
- Printer now prints dictionaries in a deterministic order, even when the keys have different types.
- testEval() in EvaluationTestCases evaluates both expressions instead of comparing expression strings. Consequently, if a statement describes a collection, its order does no longer matter when doing the comparison.
--
MOS_MIGRATED_REVID=99829458
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
index fa98c70..9445ace 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.syntax;
+import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -28,6 +29,7 @@
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.TreeMap;
/**
* Test properties of the evaluator's datatypes and utility functions
@@ -78,4 +80,24 @@
assertFalse(EvalUtils.isImmutable(makeDict()));
assertFalse(EvalUtils.isImmutable(makeFilesetEntry()));
}
+
+ @Test
+ public void testComparatorWithDifferentTypes() throws Exception {
+ TreeMap<Object, Object> map = new TreeMap<>(EvalUtils.SKYLARK_COMPARATOR);
+ map.put(2, 3);
+ map.put("1", 5);
+ map.put(42, 4);
+ map.put("test", 7);
+ map.put(-1, 2);
+ map.put("4", 6);
+ map.put(2.0, 1);
+ map.put(Environment.NONE, 0);
+
+ int expected = 0;
+ // Expected order of keys is NoneType -> Double -> Integers -> Strings
+ for (Object obj : map.values()) {
+ assertThat(obj).isEqualTo(expected);
+ ++expected;
+ }
+ }
}