aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test
diff options
context:
space:
mode:
authorGravatar Vladimir Moskva <vladmos@google.com>2016-11-22 16:51:59 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-11-22 18:15:39 +0000
commit984d6d48d0e07ac3be2bbfec667158165390eb4f (patch)
tree8a5a2b0d2f22625e24afb08cb5b00eb3880b555f /src/test
parentb10101ab8fe8d505d023f0a4556ec0c227635e24 (diff)
Allow dicts to contain non-comparable objects as keys
RELNOTES: Skylark dicts internally don't rely on keys order anymore and accept any hashable values (i.e. structs with immutable values) as keys. -- MOS_MIGRATED_REVID=139914704
Diffstat (limited to 'src/test')
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java19
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java5
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java8
3 files changed, 27 insertions, 5 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 7bc8bcbc75..690d9dee5d 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -812,6 +812,14 @@ public class SkylarkRuleClassFunctionsTest extends SkylarkTestCase {
}
@Test
+ public void testStructIncomparability() throws Exception {
+ checkErrorContains("Cannot compare structs", "struct(a = 1) < struct(a = 2)");
+ checkErrorContains("Cannot compare structs", "struct(a = 1) > struct(a = 2)");
+ checkErrorContains("Cannot compare structs", "struct(a = 1) <= struct(a = 2)");
+ checkErrorContains("Cannot compare structs", "struct(a = 1) >= struct(a = 2)");
+ }
+
+ @Test
public void testStructAccessingFieldsFromSkylark() throws Exception {
eval("x = struct(a = 1, b = 2)", "x1 = x.a", "x2 = x.b");
assertThat(lookup("x1")).isEqualTo(1);
@@ -936,6 +944,17 @@ public class SkylarkRuleClassFunctionsTest extends SkylarkTestCase {
}
@Test
+ public void testStructsInDicts() throws Exception {
+ eval("d = {struct(a = 1): 'aa', struct(b = 2): 'bb'}");
+ assertThat(eval("d[struct(a = 1)]")).isEqualTo("aa");
+ assertThat(eval("d[struct(b = 2)]")).isEqualTo("bb");
+
+ checkErrorContains(
+ "unhashable type: 'struct'",
+ "{struct(a = []): 'foo'}");
+ }
+
+ @Test
public void testStructMembersAreImmutable() throws Exception {
checkErrorContains(
"cannot assign to 's.x'",
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
index fa72014247..75e42eb312 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
@@ -272,7 +272,10 @@ public class EvaluationTest extends EvaluationTestCase {
.update(kwargs.getName(), kwargs)
.testEval(
"kwargs(foo=1, bar='bar', wiz=[1,2,3]).items()",
- "[('bar', 'bar'), ('foo', 1), ('wiz', [1, 2, 3])]");
+ "[('foo', 1), ('bar', 'bar'), ('wiz', [1, 2, 3])]")
+ .testEval(
+ "kwargs(wiz=[1,2,3], bar='bar', foo=1).items()",
+ "[('wiz', [1, 2, 3]), ('bar', 'bar'), ('foo', 1)]");
}
@Test
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
index ea81adb35d..d416c304d0 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
@@ -1311,8 +1311,8 @@ public class MethodLibraryTest extends EvaluationTestCase {
new BothModesTest()
.testEval("{1: 'foo'}.values()", "['foo']")
.testEval("{}.values()", "[]")
- .testEval("{True: 3, False: 5}.values()", "[5, 3]")
- .testEval("{'a': 5, 'c': 2, 'b': 4, 'd': 3}.values()", "[5, 4, 2, 3]");
+ .testEval("{True: 3, False: 5}.values()", "[3, 5]")
+ .testEval("{'a': 5, 'c': 2, 'b': 4, 'd': 3}.values()", "[5, 2, 4, 3]");
// sorted by keys
}
@@ -1342,7 +1342,7 @@ public class MethodLibraryTest extends EvaluationTestCase {
.testEval("{'a': 'foo'}.items()", "[('a', 'foo')]")
.testEval("{}.items()", "[]")
.testEval("{1: 3, 2: 5}.items()", "[(1, 3), (2, 5)]")
- .testEval("{'a': 5, 'c': 2, 'b': 4}.items()", "[('a', 5), ('b', 4), ('c', 2)]");
+ .testEval("{'a': 5, 'c': 2, 'b': 4}.items()", "[('a', 5), ('c', 2), ('b', 4)]");
}
@Test
@@ -1378,9 +1378,9 @@ public class MethodLibraryTest extends EvaluationTestCase {
"popitem(): dictionary is empty",
"d = {2: 'bar', 3: 'baz', 1: 'foo'}\n"
+ "if len(d) != 3: fail('popitem 0')\n"
- + "if d.popitem() != (1, 'foo'): fail('popitem 1')\n"
+ "if d.popitem() != (2, 'bar'): fail('popitem 2')\n"
+ "if d.popitem() != (3, 'baz'): fail('popitem 3')\n"
+ + "if d.popitem() != (1, 'foo'): fail('popitem 1')\n"
+ "if d != {}: fail('popitem 4')\n"
+ "d.popitem()");
}