Repository: hedyorg/hedy

Issue:
Lexographic comparison of numbers
On level 16 the start code compares the user's age to 12. But if the answer is anything from 2 to 9 the code breaks and concludes that the user is older than the writer.

I suspect that this is caused by lexographically comparing, say, "2" to "12" due to the string conversions in [ConvertToPython_16](https://github.com/Felienne/hedy/blob/666f1c31a1d/hedy.py#L861). Is this intentional? If not may I try to offer a PR to fix this?


Discussion:
Great find, thanks! Would be lovely if you fix that in a PR!!

Resolving patch:
diff --git a/hedy.py b/hedy.py
--- a/hedy.py
+++ b/hedy.py
@@ -858,17 +858,17 @@ def smaller(self, args):
         arg0 = process_variable(args[0], self.lookup)
         arg1 = process_variable(args[1], self.lookup)
         if len(args) == 2:
-            return f"str({arg0}) < str({arg1})"  # no and statements
+            return f"int({arg0}) < int({arg1})"  # no and statements
         else:
-            return f"str({arg0}) < str({arg1}) and {args[2]}"
+            return f"int({arg0}) < int({arg1}) and {args[2]}"
 
     def bigger(self, args):
         arg0 = process_variable(args[0], self.lookup)
         arg1 = process_variable(args[1], self.lookup)
         if len(args) == 2:
-            return f"str({arg0}) > str({arg1})"  # no and statements
+            return f"int({arg0}) > int({arg1})"  # no and statements
         else:
-            return f"str({arg0}) > str({arg1}) and {args[2]}"
+            return f"int({arg0}) > int({arg1}) and {args[2]}"
 
 class ConvertToPython_17(ConvertToPython_16):
     def while_loop(self, args):
@@ -933,17 +933,17 @@ def smaller_equal(self, args):
         arg0 = process_variable(args[0], self.lookup)
         arg1 = process_variable(args[1], self.lookup)
         if len(args) == 2:
-            return f"str({arg0}) <= str({arg1})"  # no and statements
+            return f"int({arg0}) <= int({arg1})"  # no and statements
         else:
-            return f"str({arg0}) <= str({arg1}) and {args[2]}"
+            return f"int({arg0}) <= int({arg1}) and {args[2]}"
 
     def bigger_equal(self, args):
         arg0 = process_variable(args[0], self.lookup)
         arg1 = process_variable(args[1], self.lookup)
         if len(args) == 2:
-            return f"str({arg0}) >= str({arg1})"  # no and statements
+            return f"int({arg0}) >= int({arg1})"  # no and statements
         else:
-            return f"str({arg0}) >= str({arg1}) and {args[2]}"
+            return f"int({arg0}) >= int({arg1}) and {args[2]}"
 
 
 def merge_grammars(grammar_text_1, grammar_text_2):


Test patch:
diff --git a/tests/tests_level_16.py b/tests/tests_level_16.py
--- a/tests/tests_level_16.py
+++ b/tests/tests_level_16.py
@@ -461,7 +461,7 @@ def test_smaller(self):
         print('Dan ben je jonger dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) < str('12'):
+    if int(leeftijd) < int('12'):
       print('Dan ben je jonger dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -475,7 +475,7 @@ def test_bigger(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) > str('12'):
+    if int(leeftijd) > int('12'):
       print('Dan ben je ouder dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -491,9 +491,9 @@ def test_big_and_small(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) < str('12'):
+    if int(leeftijd) < int('12'):
       print('Dan ben je jonger dan ik!')
-    elif str(leeftijd) > str('12'):
+    elif int(leeftijd) > int('12'):
       print('Dan ben je ouder dan ik!')""")
 
         result = hedy.transpile(code, self.level)
diff --git a/tests/tests_level_17.py b/tests/tests_level_17.py
--- a/tests/tests_level_17.py
+++ b/tests/tests_level_17.py
@@ -460,7 +460,7 @@ def test_smaller(self):
         print('Dan ben je jonger dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) < str('12'):
+    if int(leeftijd) < int('12'):
       print('Dan ben je jonger dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -474,7 +474,7 @@ def test_bigger(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) > str('12'):
+    if int(leeftijd) > int('12'):
       print('Dan ben je ouder dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -490,9 +490,9 @@ def test_big_and_small(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) < str('12'):
+    if int(leeftijd) < int('12'):
       print('Dan ben je jonger dan ik!')
-    elif str(leeftijd) > str('12'):
+    elif int(leeftijd) > int('12'):
       print('Dan ben je ouder dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -528,7 +528,7 @@ def test_whileloop2(self):
         expected = textwrap.dedent("""\
     tel = '1'
     # [' we gaan door totdat tel 3 is!']
-    while str(tel) < str('3'):
+    while int(tel) < int('3'):
       print('Dit is de '+str(tel)+'e keer')
       tel = int(tel) + int(1)
     print('We zijn klaar')""")
diff --git a/tests/tests_level_18.py b/tests/tests_level_18.py
--- a/tests/tests_level_18.py
+++ b/tests/tests_level_18.py
@@ -461,7 +461,7 @@ def test_smaller(self):
         print('Dan ben je jonger dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) < str('12'):
+    if int(leeftijd) < int('12'):
       print('Dan ben je jonger dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -475,7 +475,7 @@ def test_bigger(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) > str('12'):
+    if int(leeftijd) > int('12'):
       print('Dan ben je ouder dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -491,9 +491,9 @@ def test_big_and_small(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) < str('12'):
+    if int(leeftijd) < int('12'):
       print('Dan ben je jonger dan ik!')
-    elif str(leeftijd) > str('12'):
+    elif int(leeftijd) > int('12'):
       print('Dan ben je ouder dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -529,7 +529,7 @@ def test_whileloop2(self):
         expected = textwrap.dedent("""\
     tel = '1'
     # [' we gaan door totdat tel 3 is!']
-    while str(tel) < str('3'):
+    while int(tel) < int('3'):
       print('Dit is de '+str(tel)+'e keer')
       tel = int(tel) + int(1)
     print('We zijn klaar')""")
diff --git a/tests/tests_level_19.py b/tests/tests_level_19.py
--- a/tests/tests_level_19.py
+++ b/tests/tests_level_19.py
@@ -458,7 +458,7 @@ def test_smaller(self):
         print('Dan ben je jonger dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) < str('12'):
+    if int(leeftijd) < int('12'):
       print('Dan ben je jonger dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -472,7 +472,7 @@ def test_bigger(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) > str('12'):
+    if int(leeftijd) > int('12'):
       print('Dan ben je ouder dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -488,9 +488,9 @@ def test_big_and_small(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) < str('12'):
+    if int(leeftijd) < int('12'):
       print('Dan ben je jonger dan ik!')
-    elif str(leeftijd) > str('12'):
+    elif int(leeftijd) > int('12'):
       print('Dan ben je ouder dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -526,7 +526,7 @@ def test_whileloop2(self):
         expected = textwrap.dedent("""\
     tel = '1'
     # [' we gaan door totdat tel 3 is!']
-    while str(tel) < str('3'):
+    while int(tel) < int('3'):
       print('Dit is de '+str(tel)+'e keer')
       tel = int(tel) + int(1)
     print('We zijn klaar')""")
diff --git a/tests/tests_level_20.py b/tests/tests_level_20.py
--- a/tests/tests_level_20.py
+++ b/tests/tests_level_20.py
@@ -459,7 +459,7 @@ def test_smaller(self):
         print('Dan ben je jonger dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) < str('12'):
+    if int(leeftijd) < int('12'):
       print('Dan ben je jonger dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -473,7 +473,7 @@ def test_bigger(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) > str('12'):
+    if int(leeftijd) > int('12'):
       print('Dan ben je ouder dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -489,9 +489,9 @@ def test_big_and_small(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) < str('12'):
+    if int(leeftijd) < int('12'):
       print('Dan ben je jonger dan ik!')
-    elif str(leeftijd) > str('12'):
+    elif int(leeftijd) > int('12'):
       print('Dan ben je ouder dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -527,7 +527,7 @@ def test_whileloop2(self):
         expected = textwrap.dedent("""\
     tel = '1'
     # [' we gaan door totdat tel 3 is!']
-    while str(tel) < str('3'):
+    while int(tel) < int('3'):
       print('Dit is de '+str(tel)+'e keer')
       tel = int(tel) + int(1)
     print('We zijn klaar')""")
diff --git a/tests/tests_level_21.py b/tests/tests_level_21.py
--- a/tests/tests_level_21.py
+++ b/tests/tests_level_21.py
@@ -459,7 +459,7 @@ def test_smaller(self):
         print('Dan ben je jonger dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) < str('12'):
+    if int(leeftijd) < int('12'):
       print('Dan ben je jonger dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -473,7 +473,7 @@ def test_bigger(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) > str('12'):
+    if int(leeftijd) > int('12'):
       print('Dan ben je ouder dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -489,9 +489,9 @@ def test_big_and_small(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) < str('12'):
+    if int(leeftijd) < int('12'):
       print('Dan ben je jonger dan ik!')
-    elif str(leeftijd) > str('12'):
+    elif int(leeftijd) > int('12'):
       print('Dan ben je ouder dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -527,7 +527,7 @@ def test_whileloop2(self):
         expected = textwrap.dedent("""\
     tel = '1'
     # [' we gaan door totdat tel 3 is!']
-    while str(tel) < str('3'):
+    while int(tel) < int('3'):
       print('Dit is de '+str(tel)+'e keer')
       tel = int(tel) + int(1)
     print('We zijn klaar')""")
diff --git a/tests/tests_level_22.py b/tests/tests_level_22.py
--- a/tests/tests_level_22.py
+++ b/tests/tests_level_22.py
@@ -459,7 +459,7 @@ def test_smaller(self):
         print('Dan ben je jonger dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) < str('12'):
+    if int(leeftijd) < int('12'):
       print('Dan ben je jonger dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -473,7 +473,7 @@ def test_bigger(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) > str('12'):
+    if int(leeftijd) > int('12'):
       print('Dan ben je ouder dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -489,9 +489,9 @@ def test_big_and_small(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Hoe oud ben jij?')
-    if str(leeftijd) < str('12'):
+    if int(leeftijd) < int('12'):
       print('Dan ben je jonger dan ik!')
-    elif str(leeftijd) > str('12'):
+    elif int(leeftijd) > int('12'):
       print('Dan ben je ouder dan ik!')""")
 
         result = hedy.transpile(code, self.level)
@@ -527,7 +527,7 @@ def test_whileloop2(self):
         expected = textwrap.dedent("""\
     tel = '1'
     # [' we gaan door totdat tel 3 is!']
-    while str(tel) < str('3'):
+    while int(tel) < int('3'):
       print('Dit is de '+str(tel)+'e keer')
       tel = int(tel) + int(1)
     print('We zijn klaar')""")
@@ -660,7 +660,7 @@ def test_smaller_equal(self):
         print('Dan ben je jonger dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Ik ben 12 jaar, hoe oud ben jij?')
-    if str(leeftijd) <= str('11'):
+    if int(leeftijd) <= int('11'):
       print('Dan ben je jonger dan ik!')""")
         result = hedy.transpile(code, self.level)
         self.assertEqual(expected, result.code)
@@ -673,7 +673,7 @@ def test_bigger_equal(self):
         print('Dan ben je jonger dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Ik ben 12 jaar, hoe oud ben jij?')
-    if str(leeftijd) >= str('11'):
+    if int(leeftijd) >= int('11'):
       print('Dan ben je jonger dan ik!')""")
         result = hedy.transpile(code, self.level)
         self.assertEqual(expected, result.code)
@@ -688,9 +688,9 @@ def test_smaller_bigger_equal(self):
         print('Dan ben je ouder dan ik!')""")
         expected = textwrap.dedent("""\
     leeftijd = input('Ik ben 12 jaar, hoe oud ben jij?')
-    if str(leeftijd) <= str('11'):
+    if int(leeftijd) <= int('11'):
       print('Dan ben je jonger dan ik!')
-    elif str(leeftijd) >= str('13'):
+    elif int(leeftijd) >= int('13'):
       print('Dan ben je ouder dan ik!')""")
         result = hedy.transpile(code, self.level)
         self.assertEqual(expected, result.code)