From d20ac2b079ab61931b90b507b92d6ccc3fa8f943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20Garc=C3=ADa?= Date: Mon, 22 Jun 2020 03:52:05 +0200 Subject: [PATCH] Fix bug getting patched variable. --- gradle.properties | 2 +- .../bladecoder/ink/runtime/StoryState.java | 1 + .../ink/runtime/VariablesState.java | 13 ++++++++ .../ink/runtime/test/ListSpecTest.java | 31 ++++++++++++++++--- .../inkfiles/lists/bug-adding-element.ink | 14 +++++++++ .../lists/bug-adding-element.ink.json | 1 + 6 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 src/test/resources/inkfiles/lists/bug-adding-element.ink create mode 100644 src/test/resources/inkfiles/lists/bug-adding-element.ink.json diff --git a/gradle.properties b/gradle.properties index 5476745..8549450 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ # Matching Ink v0.9.0 -version=0.7.3 +version=0.7.4 diff --git a/src/main/java/com/bladecoder/ink/runtime/StoryState.java b/src/main/java/com/bladecoder/ink/runtime/StoryState.java index be9fff2..887db52 100644 --- a/src/main/java/com/bladecoder/ink/runtime/StoryState.java +++ b/src/main/java/com/bladecoder/ink/runtime/StoryState.java @@ -475,6 +475,7 @@ void pushEvaluationStack(RTObject obj) { if (rawList.getOrigins() == null) rawList.setOrigins(new ArrayList()); + rawList.getOrigins().clear(); for (String n : rawList.getOriginNames()) { diff --git a/src/main/java/com/bladecoder/ink/runtime/VariablesState.java b/src/main/java/com/bladecoder/ink/runtime/VariablesState.java index e15febf..fb5f088 100644 --- a/src/main/java/com/bladecoder/ink/runtime/VariablesState.java +++ b/src/main/java/com/bladecoder/ink/runtime/VariablesState.java @@ -216,11 +216,24 @@ RTObject getRawVariableWithName(String name, int contextIndex) throws Exception RTObject varValue = null; // 0 context = global if (contextIndex == 0 || contextIndex == -1) { + if (patch != null && patch.getGlobal(name) != null) + return patch.getGlobal(name); + varValue = globalVariables.get(name); if (varValue != null) { return varValue; } + // Getting variables can actually happen during globals set up since you can do + // VAR x = A_LIST_ITEM + // So _defaultGlobalVariables may be null. + // We need to do this check though in case a new global is added, so we need to + // revert to the default globals dictionary since an initial value hasn't yet + // been set. + if (defaultGlobalVariables != null && defaultGlobalVariables.containsKey(name)) { + return defaultGlobalVariables.get(name); + } + ListValue listItemValue = listDefsOrigin.findSingleItemListWithName(name); if (listItemValue != null) return listItemValue; diff --git a/src/test/java/com/bladecoder/ink/runtime/test/ListSpecTest.java b/src/test/java/com/bladecoder/ink/runtime/test/ListSpecTest.java index ca93d28..2bc901a 100644 --- a/src/test/java/com/bladecoder/ink/runtime/test/ListSpecTest.java +++ b/src/test/java/com/bladecoder/ink/runtime/test/ListSpecTest.java @@ -77,10 +77,10 @@ public void testListSaveLoad() throws Exception { story.choosePathString("elsewhere"); // FIXME: This is the test from the C# impl. Is it correct? // Assert.assertEquals("a, x, c, z\n", story.continueMaximally()); - + Assert.assertEquals("z\n", story.continueMaximally()); } - + /** * "- TestEmptyListOriginAfterAssignment" */ @@ -92,14 +92,35 @@ public void testEmptyListOriginAfterAssignment() throws Exception { Assert.assertEquals("a, b, c\n", story.continueMaximally()); } - - //@Test + + // @Test public void testListRange() throws Exception { String json = TestUtils.getJsonString("inkfiles/lists/list-range.ink.json"); Story story = new Story(json); - Assert.assertEquals("Pound, Pizza, Euro, Pasta, Dollar, Curry, Paella\nEuro, Pasta, Dollar, Curry\nTwo, Three, Four, Five, Six\nPizza, Pasta\n", story.continueMaximally()); + Assert.assertEquals( + "Pound, Pizza, Euro, Pasta, Dollar, Curry, Paella\nEuro, Pasta, Dollar, Curry\nTwo, Three, Four, Five, Six\nPizza, Pasta\n", + story.continueMaximally()); + } + + @Test + public void testBugAddingElement() throws Exception { + + String json = TestUtils.getJsonString("inkfiles/lists/bug-adding-element.ink.json"); + Story story = new Story(json); + + String s = story.continueMaximally(); + Assert.assertEquals("", s); + + story.chooseChoiceIndex(0); + s = story.continueMaximally(); + Assert.assertEquals("a\n", s); + + story.chooseChoiceIndex(1); + s = story.continueMaximally(); + Assert.assertEquals("OK\n", s); + } } diff --git a/src/test/resources/inkfiles/lists/bug-adding-element.ink b/src/test/resources/inkfiles/lists/bug-adding-element.ink new file mode 100644 index 0000000..87b1a54 --- /dev/null +++ b/src/test/resources/inkfiles/lists/bug-adding-element.ink @@ -0,0 +1,14 @@ +LIST gameState = KNOW_ALIEN_REPORT + +- (init) + ++ a + ~ gameState += KNOW_ALIEN_REPORT + -> init + ++ {gameState ? KNOW_ALIEN_REPORT} OK + -> init + ++ FAIL + -> END + diff --git a/src/test/resources/inkfiles/lists/bug-adding-element.ink.json b/src/test/resources/inkfiles/lists/bug-adding-element.ink.json new file mode 100644 index 0000000..74b4e7a --- /dev/null +++ b/src/test/resources/inkfiles/lists/bug-adding-element.ink.json @@ -0,0 +1 @@ +{"inkVersion":19,"root":[[[["ev",{"^->":"0.init.0.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":2},{"s":["^a",{"->":"$r","var":true},null]}],["ev",{"^->":"0.init.1.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str",{"VAR?":"gameState"},{"VAR?":"KNOW_ALIEN_REPORT"},"?","/ev",{"*":".^.^.c-1","flg":3},{"s":["^OK",{"->":"$r","var":true},null]}],["ev",{"^->":"0.init.2.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-2","flg":2},{"s":["^FAIL",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"0.init.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.0.s"},[{"#n":"$r2"}],"\n","ev",{"VAR?":"gameState"},{"VAR?":"KNOW_ALIEN_REPORT"},"+",{"VAR=":"gameState","re":true},"/ev",{"->":".^.^"},{"->":"0.g-0"},{"#f":5}],"c-1":["ev",{"^->":"0.init.c-1.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.1.s"},[{"#n":"$r2"}],"\n",{"->":".^.^"},{"->":"0.g-0"},{"#f":5}],"c-2":["ev",{"^->":"0.init.c-2.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.2.s"},[{"#n":"$r2"}],"\n","end",{"->":"0.g-0"},{"#f":5}],"#f":5,"#n":"init"}],{"g-0":["done",{"#f":5}]}],"done",{"global decl":["ev",{"list":{},"origins":["gameState"]},{"VAR=":"gameState"},"/ev","end",null],"#f":1}],"listDefs":{"gameState":{"KNOW_ALIEN_REPORT":1}}} \ No newline at end of file