def test_ranges(self): self.assertEqual( Run("…¹¦¹⁰"), """\ - -- --- ---- ----- ------ ------- -------- ---------""") self.assertEqual(Run("…a¦e"), "a\nb\nc\nd") self.assertEqual( Run("…·¹¦¹⁰"), """\ - -- --- ---- ----- ------ ------- -------- --------- ----------""") self.assertEqual(Run("…·a¦e"), "a\nb\nc\nd\ne")
def test_oblong(self): self.assertEqual(Run("UO⁵¦⁵a"), """\ aaaaa aaaaa aaaaa aaaaa aaaaa""") self.assertEqual(Run("UO±⁵¦±⁵a"), """\ aaaaa aaaaa aaaaa aaaaa aaaaa""") self.assertEqual( Run("\ NθNηNζUOθ#M÷⁻θη²↘UOη*M÷⁻ηζ²↘UOζ@", "[12,6,2]"), """\ ############ ############ ############ ###******### ###******### ###**@@**### ###**@@**### ###******### ###******### ############ ############ ############""")
def test_polygon(self): self.assertEqual(Run("G+⁵a"), """\ aaaaa aaaaa aaaaa aaaaa aaaaa""") self.assertEqual(Run("G↗↘←⁴*#M↓*"), """\ # *#* #*#*# *#*#*#* * """) self.assertEqual(Run("G↗↘←⁴*#¶#*M↓*"), """\ * *#* *#*#* *#*#*#* * """) self.assertEqual( Run("G↘↗↙↙⁵#"), """\ ######### ######## ####### ###### ##### #### ### ## # """)
def test_codepage(self): self.assertEqual(Run("\xC7+\xB5a\xE0 ", normal_encoding=True), """\ a a a a a a a a a a a a a a a""") self.assertEqual(Run("\xFF\xA4\xEC", normal_encoding=True), "╬")
def test_eval(self): self.assertEqual(Run("VS", "abc←←M←abc"), "abc") self.assertEqual(Run("↓VS", "⁺⁵¦⁵"), ("|\n" * 10)[:-1]) self.assertEqual( Run("Evaluate(InputString())", "abc←←M←abc", verbose=True), "abc") self.assertEqual( Run("Print(:Down, Evaluate(InputString()))", "⁺⁵¦⁵", verbose=True), ("|\n" * 10)[:-1])
def test_while(self): self.assertEqual(Run("A⁵βWβ«abA⁻β¹β»"), "ababababab") self.assertEqual( Run("""\ Assign(5, b); while (b) { Print('ab'); Assign(Subtract(b, 1), b); }""", verbose=True), "ababababab")
def test_extend(self): self.assertEqual(Run("foobarUE¹"), "f o o b a r") self.assertEqual( Run("foobar¶baz¶→→quuxUE³¦³"), """\ f o o b a r b a z q u u x """)
def test_escape(self): self.assertEqual(Run("G+⁵a´¶´‖"), """\ a¶‖a¶ a¶‖a¶ a¶‖a¶ a¶‖a¶ a¶‖a¶""") self.assertEqual(Run("`G+`5a`` `\n`` `;", grave=True), """\ a¶‖a¶ a¶‖a¶ a¶‖a¶ a¶‖a¶ a¶‖a¶""")
def test_reflect(self): self.assertEqual(Run("a c¶d¶ghi‖←a"), " c a\n d\naihg") self.assertEqual(Run("a c¶d¶ghi‖→a"), " c a\n d\naihg") self.assertEqual(Run("a c¶d¶ghi‖↑a"), "ghia\nd \na c ") self.assertEqual(Run("a c¶d¶ghi‖↓a"), "ghia\nd \na c ") self.assertEqual(Run("a c¶d¶ghi‖↖a"), "a \ni c\nh \ngda") self.assertEqual(Run("a c¶d¶ghi‖↗a"), "adg\n h\nc i\n a") self.assertEqual(Run("a c¶d¶ghi‖↙a"), "adg\n h\nc i\n a") self.assertEqual(Run("a c¶d¶ghi‖↘a"), "a \ni c\nh \ngda")
def test_rectangle(self): self.assertEqual(Run("UR⁵¦⁵"), """\ +---+ | | | | | | +---+""") self.assertEqual(Run("UR±⁵¦±⁵"), """\ +---+ | | | | | | +---+""") self.assertEqual(Run("Rectangle(5, 5)", verbose=True), """\ +---+ | | | | | | +---+""")
def test_whitespace(self): self.assertEqual(Run("""\ G + ⁵ a´ """, whitespace=True), """\ a a a a a a a a a a a a a a a""")
def test_rotate_shutter(self): self.assertEqual( Run("⁴+⟲S²⁴⁶"), """\ | | | | ----+---- | | | | """)
def test_comparison(self): self.assertEqual(Run("⁼¹¦¹"), "-") self.assertEqual(Run("‹⁰¦¹"), "-") self.assertEqual(Run("›¹¦⁰"), "-") self.assertEqual(Run("⁼⁰¦¹"), "") self.assertEqual(Run("‹²¦¹"), "") self.assertEqual(Run("›¹¦²"), "")
def test_input(self): self.assertEqual(Run("WSι", "[\"abc\", 5, \"foobar\"]"), "abc5foobar") self.assertEqual(Run("WSι", "abc\n5\nfoobar"), "abc5foobar") self.assertEqual(Run("WSι", "abc 5 foobar"), "abc5foobar") self.assertEqual(Run("WNι", "[1, 2, \"3\"]"), "------") self.assertEqual(Run("WNι", "1\n2\n3"), "------") self.assertEqual(Run("WNι", "1 2 3"), "------")
def test_rotate_prism(self): self.assertEqual( Run("|----⟲P²⁴⁶"), """\ - | | | |----| |----| | | | - """)
def test_jump(self): self.assertEqual(Run("aM³¦³a"), """\ a a""") self.assertEqual(Run("abJ³¦³a"), """\ ab a""") self.assertEqual( Run("Print(\"a\");Move(3, 3);Print(\"a\");", verbose=True), """\ a a""") self.assertEqual( Run("Print(\"ab\");JumpTo(3, 3);Print(\"a\");", verbose=True), """\ ab a""")
def test_for(self): self.assertEqual(Run("F⁵a"), "aaaaa") self.assertEqual(Run("FabcιFdefι"), "abcdef") self.assertEqual(Run("A⁵ιFSκ", "foobar"), "foobar") self.assertEqual(Run("≔i«ικλ»▶i⟦a¦bc¦d⟧"), "abcd") self.assertEqual(Run("for(5)Print('a')", verbose=True), "aaaaa") self.assertEqual( Run("Assign(5,i);for(InputString())Print(k)", "foobar", verbose=True), "foobar")
def test_copy(self): self.assertEqual( Run("G+⁵*C³¦³"), """\ ***** ***** ***** ******** ******** ***** ***** *****""") self.assertEqual( Run("G→⁵↓⁶*C³¦³"), """\ ***** * * ***** * * * * * * *""") self.assertEqual(Run("***¶ *¶ *C¹¦¹"), """\ *** *** * *""") self.assertEqual( Run("Polygon(:+, 5, '*');Copy(3, 3)", verbose=True), """\ ***** ***** ***** ******** ******** ***** ***** *****""") self.assertEqual( Run("Polygon(:Right, 5, :Down, 6, '*');Copy(3, 3)", verbose=True), """\ ***** * * ***** * * * * * * *""") self.assertEqual( Run("Print('***\\n *\\n *');Copy(1, 1)", verbose=True), """\ *** *** * *""")
def test_pivot(self): self.assertEqual(Run("↶¹asdf"), " f\n d \n s \na ") self.assertEqual(Run("↶²asdf"), "f\nd\ns\na") self.assertEqual(Run("PivotLeft(1);Print('asdf')", verbose=True), " f\n d \n s \na ") self.assertEqual(Run("PivotLeft(2);Print('asdf')", verbose=True), "f\nd\ns\na") self.assertEqual( Run("PivotLeft(2);Print('asdf\\rghjk')", verbose=True), "fk\ndj\nsh\nag") self.assertEqual( Run("PivotLeft(1);Print('asdf\\rghjk')", verbose=True), " f \n d k\n s j \na h \n g ")
def test_if(self): self.assertEqual(Run("¿¹asdf"), "asdf") self.assertEqual(Run("¿⁰asdf"), "") self.assertEqual(Run("¿⁰«asdf»ghjk"), "ghjk") self.assertEqual(Run("if(1)Print('asdf')", verbose=True), "asdf") self.assertEqual(Run("if(0)Print('asdf')", verbose=True), "") self.assertEqual( Run("""\ if (0) { Print('asdf') } //else Print('ghjk')""", verbose=True), "ghjk")
def test_peek(self): # TODO: test manipulation when list methods implemented self.assertEqual(Run("barM←×KK⁵"), "barrrrr") self.assertEqual(Run("barM←⪫KD³←ω"), "barab") self.assertEqual( Run("↓foo×⪫KAω⁵"), """\ f o o foofoofoofoofoo""") self.assertEqual(Run("baz←M←×⪫KMω⁵"), "bzbzbzbzbzb") self.assertEqual(Run("quux←M←×⪫KVω⁵"), "quxuxuxuxuxu") self.assertEqual(Run("quux``4`M``4`*``j`K`V`w`5", grave=True), "quxuxuxuxuxu")
def ensure(text, strings, expected, limits, validate=trues, inp=""): global i i += 1 print("\033[32;1m=== Level %i ===\033[0m" % i) print(text % strings[index]) print("Print:") print(expected) if inp: inputs = literal_eval(inp) print("With the input%s:" % ("s" * (len(inputs) > 1))) print("\n".join(literal_eval(inp))) try: while True: code = "" while not len(code): code = input("\033[36;1mCharcoal> \033[0m") if len(code) > limits[index]: print("Try again. Your code was too long.") continue if not validate[index](code): print("Try again. Please use the syntax given.") continue result = Run(code, inp, grave=argv.grave, verbose=argv.verbose) if result == expected: print("Congratulations on passing level %i!" % i) return if len(result): print("Try again. Your output was:") print(result) else: print("""\ Your code gave no output. Did you make a mistake? Please read the level text \ to make sure you did not miss anything important.""") except (KeyboardInterrupt, EOFError): print() sys.exit()
def test_rotate(self): self.assertEqual(Run("abc¶def¶ghi⟲²"), "cfi\nbeh\nadg") self.assertEqual(Run("abc¶def¶ghi⟲¹"), """\ c b f a e i d h g """) self.assertEqual(Run("abc¶def¶ghi⟲¹a"), """\ c b f a a e i d h g """) self.assertEqual(Run("abc¶def¶ghi⟲³a"), """\ a i f h c e g b d a """) self.assertEqual(Run("a c¶d¶g⟲²a"), "c \n a\nadg") self.assertEqual(Run("a c¶d¶g⟲⁶a"), "gda\na \n c") self.assertEqual(Run("a c¶d¶g⟲⁴a"), " ag\n d\nc a")
def test_box(self): self.assertEqual(Run("B⁵¦⁵*"), """\ ***** * * * * * * *****""") self.assertEqual(Run("B⁵¦⁵123"), """\ 12312 1 3 3 1 2 2 13213""") self.assertEqual(Run("Box(5, 5, '*')", verbose=True), """\ ***** * * * * * * *****""") self.assertEqual(Run("Box(5, 5, '123')", verbose=True), """\ 12312 1 3 3 1 2 2 13213""") self.assertEqual(Run("Box(5.999, 5.999, '123')", verbose=True), """\ 12312 1 3 3 1 2 2 13213""") self.assertEqual( Run(""" Box(Times(2.999, 1.999), 5.999, '123')""", verbose=True), """\ 12312 1 3 3 1 2 2 13213""")
In verbose mode, Print() is needed to print a value."""), expected, (length, length, length + 11))) (expected, len(expected)))(word()), lambda: (lambda expected: ("A number is %s.", ("a run of any character in '⁰¹²³⁴⁵⁶⁷⁸⁹·'", "a run of '`0'-'`9' or '`.'", "an ordinary number"), expected, (1, 2, 10)))("-" * randint(5, 9)), lambda: (lambda expected: (lambda expected, length: ( """\ Another important part of Charcoal is its directional printing. Preceding a number with one of the directions %s \ prints a line with a character selected from '-|/\\' in that direction.""", ("'←↑→↓↖↗↘↙'", "'``0'-'``9' according to numpad directions", """ :Up, :Down, :Left, :Right:UpLeft, :UpRight, :DownLeft and :DownRight""" ), expected, (2, 5, 22)))(expected, len(expected))) (Run(choice("←↑→↓↖↗↘↙") + choice("⁵⁶⁷⁸⁹"))), lambda: (lambda expected: ("""\ A language is never complete without arithmetic. Charcoal has the basic arithmetic operators %s, but the cast operator %s is needed to see the result as a number, and a separator %s is needed to delimit two of the same literal type.%s""", ( ("'⁺⁻×÷'", "'I'", "'¦'", ""), ("'`+`-`*`/'", "'`I'", "'`:'", ""), (""" Plus (+), Minus (-), Times (*) and Divide (/)""", "Cast", "',', ';' or ' '", """ In verbose mode, operators are called like functions: e.g. Plus(1, 'a') or +(1, 'a')""") ), expected, (5, 10, 22), (lambda code: code[0] == "I" and code[ 1] in "⁺⁻×÷", lambda code: code[:2] == "`I" and code[ 2:4] in "`+`-`*`/", lambda code: "Cast" in code and any( operator in code for operator in ["+", "-", "*", "/", "Plus", "Minus", "Times", "Divide"]))))
def test_reflect_overlap(self): self.assertEqual(Run("abc¶def¶ghi‖O←"), "cbabc\nfedef\nihghi") self.assertEqual(Run("abc¶def¶ghi‖O←a"), " cbabc\n fedef\naihghi") self.assertEqual(Run("abc¶def¶ghi‖O→a"), "abcba\ndefed\ngaihg") self.assertEqual(Run("abc¶def¶ghi↑‖O↖a"), """\ a ifc heb gdabc def ghi""") self.assertEqual(Run("abc¶def¶ghi↑‖O↗a"), """\ adg beh abcfi defa ghi """) self.assertEqual(Run("abc¶def¶ghi↑‖O↙a"), """\ abc def adghi beh cfi a """) self.assertEqual(Run("abc¶def¶ghi↑‖O↘a"), """\ abc defa ghifc heb gda""") self.assertEqual(Run("abc¶d¶gh‖O←"), "cbabc\n d \n hgh ") self.assertEqual(Run("abc¶d¶gh‖O→"), "abcba\nd d\ngh hg") self.assertEqual(Run("abc¶ d¶ gh‖O←"), "cbabc\nd d\nhg gh") self.assertEqual(Run("a c¶d¶ghi‖O↑"), "ghi\nd \na c\nd \nghi") self.assertEqual(Run("a c¶d¶ghi‖O↓"), "a c\nd \nghi\nd \na c") self.assertEqual(Run("a c¶d¶ghi¶jkl‖O↓"), """\ a c d ghi jkl ghi d a c""") self.assertEqual(Run("a¶¶¶¶¶→→→→a‖O↙"), """\ a a a""") self.assertEqual(Run("a¶¶¶¶¶←←←←a‖O↘"), """\ a a a """) self.assertEqual(Run("a c¶d¶ghi‖O↖"), """\ i c h gda c d ghi""") self.assertEqual(Run("a c¶ d¶ghi‖O↖"), """\ i c hd g a c d ghi""") self.assertEqual(Run(" a¶ d¶ghi‖O↖"), """\ i a hd g a d ghi""") self.assertEqual(Run("a¶bcd‖O↖"), """\ d c ba bcd""") self.assertEqual(Run("abc¶d‖O↖"), """\ c b dabc d """) self.assertEqual(Run("a¶d¶ghi‖O↖"), """\ i h gda d ghi""") self.assertEqual(Run("cdeM↖bM↖a‖O↖"), """\ eba d b cde""") self.assertEqual(Run("abcM↖d‖O↖"), """\ cd b d abc""") self.assertEqual(Run("a¶d¶ghi‖O↗"), """\ adg d h ghi""") self.assertEqual(Run("a c¶d¶ghi‖O↗"), """\ adg h a c i d ghi """) self.assertEqual(Run("a c¶ d¶ghi‖O↗"), """\ a g dh a c i d ghi """) self.assertEqual(Run(" a¶ d¶ghi‖O↗"), """\ g dh a i d ghi """) self.assertEqual(Run("a¶bcd‖O↗"), """\ ab a c bcd""") self.assertEqual(Run("abc¶d‖O↗"), """\ ad b abc d """) self.assertEqual(Run("a¶d¶ghi‖O↗"), """\ adg d h ghi""") self.assertEqual(Run("abcM↖d‖O↗"), """\ a b dc abc """) self.assertEqual(Run("a c¶d¶ghi‖O↙"), """\ a c d adghi h c i """) self.assertEqual(Run("a c¶ d¶ghi‖O↙"), """\ a c d a ghi dh c i """) self.assertEqual(Run(" a¶ d¶ghi‖O↙"), """\ a d ghi dh a i """) self.assertEqual(Run("a¶bcd‖O↙"), """\ a abcd c d """) self.assertEqual(Run("abc¶d‖O↙"), """\ abc ad b c """) self.assertEqual(Run("a¶d¶ghi‖O↙"), """\ a d adghi h i """) self.assertEqual(Run("abcM↖d‖O↙"), """\ d abc b dc """) self.assertEqual(Run("a c¶d¶ghi‖O↘"), """\ a c d ghi c h gda""") self.assertEqual(Run("a c¶ d¶ghi‖O↘"), """\ a c d ghi c hd g a""") self.assertEqual(Run(" a¶ d¶ghi‖O↘"), """\ a d ghi a hd g """) self.assertEqual(Run("a¶bcd‖O↘"), """\ a bcd c ba""") self.assertEqual(Run("abc¶d‖O↘"), """\ abc d b da""") self.assertEqual(Run("a¶d¶ghi‖O↘"), """\ a d ghi h gda""") self.assertEqual(Run("a¶d¶ghi‖OO↘²"), """\ a d ghi gda""") self.assertEqual(Run("abcM↖d‖OO↖²"), """\ cdd abc""")
def test_reflect_copy(self): self.assertEqual(Run("abc¶def¶ghi‖C←"), "cbaabc\nfeddef\nihgghi") self.assertEqual(Run("abc¶d¶gh‖C←"), "cbaabc\n dd \n hggh ") self.assertEqual(Run("abc¶d¶gh‖C→"), "abccba\nd d\ngh hg") self.assertEqual( Run("abc¶def¶ghi↑‖C↖a"), """\ a ifc heb gda abc def ghi""") self.assertEqual(Run("abc¶def¶ghi↑‖C↗a"), """\ adg beh cfi abc a def ghi """) self.assertEqual( Run("abc¶def¶ghi↑‖C↙a"), """\ abc def ghi adg beh cfi a """) self.assertEqual(Run("abc¶def¶ghi↑‖C↘a"), """\ abc def ghi a ifc heb gda""") self.assertEqual(Run("abc¶ d¶ gh‖C←"), "cbaabc\nd d\nhg gh") self.assertEqual(Run("a c¶d¶ghi‖C↑"), "ghi\nd \na c\na c\nd \nghi") self.assertEqual(Run("a c¶d¶ghi‖C↓"), "a c\nd \nghi\nghi\nd \na c") self.assertEqual( Run("a¶¶¶¶¶→→→→a‖C↙"), """\ a a a a """) self.assertEqual( Run("a¶¶¶¶¶←←←←a‖C↘"), """\ a a a a """) self.assertEqual(Run("a c¶d¶ghi‖C↖"), """\ i c h gda a c d ghi""") self.assertEqual(Run("a c¶ d¶ghi‖C↖"), """\ i c hd g a a c d ghi""") self.assertEqual(Run(" a¶ d¶ghi‖C↖"), """\ i a hd g a d ghi""") self.assertEqual(Run("a¶bcd‖C↖"), """\ d c ba a bcd""") self.assertEqual(Run("abc¶d‖C↖"), """\ c b da abc d """) self.assertEqual(Run("a¶d¶ghi‖C↖"), """\ i h gda a d ghi""") self.assertEqual(Run("cdeM↖bM↖a‖C↖"), """\ eba d a c b cde""") self.assertEqual(Run("abcM↖d‖C↖"), """\ cd b a d abc""") self.assertEqual(Run("a¶d¶ghi‖C↗"), """\ adg a h d i ghi """) self.assertEqual(Run("a c¶d¶ghi‖C↗"), """\ adg h c i a c d ghi """) self.assertEqual(Run("a c¶ d¶ghi‖C↗"), """\ a g dh c i a c d ghi """) self.assertEqual(Run(" a¶ d¶ghi‖C↗"), """\ g dh a i a d ghi """) self.assertEqual(Run("a¶bcd‖C↗"), """\ ab c a d bcd """) self.assertEqual(Run("abc¶d‖C↗"), """\ ad b c abc d """) self.assertEqual(Run("a¶d¶ghi‖C↗"), """\ adg a h d i ghi """) self.assertEqual(Run("abcM↖d‖C↗"), """\ a b dc d abc """) self.assertEqual(Run("a c¶d¶ghi‖C↙"), """\ a c d ghi adg h c i """) self.assertEqual(Run("a c¶ d¶ghi‖C↙"), """\ a c d ghi a g dh c i """) self.assertEqual(Run(" a¶ d¶ghi‖C↙"), """\ a d ghi g dh a i """) self.assertEqual(Run("a¶bcd‖C↙"), """\ a bcd ab c d """) self.assertEqual(Run("abc¶d‖C↙"), """\ abc d ad b c """) self.assertEqual(Run("a¶d¶ghi‖C↙"), """\ a d ghi adg h i """) self.assertEqual(Run("abcM↖d‖C↙"), """\ d abc a b dc """) self.assertEqual(Run("a c¶d¶ghi‖C↘"), """\ a c d ghi i c h gda""") self.assertEqual(Run("a c¶ d¶ghi‖C↘"), """\ a c d ghi i c hd g a""") self.assertEqual(Run(" a¶ d¶ghi‖C↘"), """\ a d ghi i a hd g """) self.assertEqual(Run("a¶bcd‖C↘"), """\ a bcd d c ba""") self.assertEqual(Run("abc¶d‖C↘"), """\ abc d c b da""") self.assertEqual(Run("a¶d¶ghi‖C↘"), """\ a d ghi i h gda""") self.assertEqual( Run("↗⁶‖C↓a"), """\ / / / / / / / / / / / / a""") self.assertEqual( Run("↘⁶‖C↑a"), """\ a \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ """) self.assertEqual( Run("↗²↖↙⁴‖Ca"), """\ // / / / // / / / / / a""") self.assertEqual(Run("↗²↖↙⁴‖C←a"), """\ / / / / / / / / / // / a """)
def test_rotate_overlap(self): self.assertEqual(Run("abc¶de⟲O²"), """\ abc de be ad""") self.assertEqual(Run("abc¶de⟲O⁴"), """\ abc de ed cba""") self.assertEqual(Run("abc¶de⟲O⁶"), """\ da abcb de c""") self.assertEqual(Run("abc↙M←de⟲O↙²"), """\ ce babc a de""") self.assertEqual(Run("abc↙M←de⟲O↙⁴"), """\ abc ed de cba """) self.assertEqual(Run("abc↙M←de⟲O↙⁶"), """\ abc de db ec """) self.assertEqual(Run("abc↖M←de⟲O↖²"), """\ ec db de abc""") self.assertEqual(Run("abc↖M←de⟲O↖⁴"), """\ cba ed de abc""") self.assertEqual(Run("abc↖M←de⟲O↖⁶"), """\ a de babc ce """) self.assertEqual(Run("de¶abc⟲O↗²"), """\ de c abcb da""") self.assertEqual(Run("de¶abc⟲O↗⁴"), """\ cba de ed abc """) self.assertEqual(Run("de¶abc⟲O↗⁶"), """\ ad be de abc""") self.assertEqual( Run("Print('abc\\nde');RotateOverlap(2)", verbose=True), """\ abc de be ad""") self.assertEqual( Run("Print('abc\\nde');RotateOverlap(4)", verbose=True), """\ abc de ed cba""") self.assertEqual( Run("Print('abc\\nde');RotateOverlap(6)", verbose=True), """\ da abcb de c""") self.assertEqual( Run(""" Print('abc'); Move(:DownLeft); Move(:Left); Print('de'); RotateOverlap(:DownLeft, 2)""", verbose=True), """\ ce babc a de""") self.assertEqual( Run(""" Print('abc'); Move(:DownLeft); Move(:Left); Print('de'); RotateOverlap(:DownLeft, 4)""", verbose=True), """\ abc ed de cba """) self.assertEqual( Run(""" Print('abc'); Move(:DownLeft); Move(:Left); Print('de'); RotateOverlap(:DownLeft, 6)""", verbose=True), """\ abc de db ec """) self.assertEqual( Run("abcM↓def⟲C↖²⁴⁶"), """\ f e d c fed b cbaa aabc b def c d e f """) self.assertEqual( Run("abcM↓def⟲O↖²⁴⁶"), """\ f e d c fed b cbabc b def c d e f """)
def test_multiprint(self): self.assertEqual(Run("Pabc"), "abc") self.assertEqual(Run("P→abc"), "abc") self.assertEqual(Run("P↓abc"), "a\nb\nc") self.assertEqual(Run("P←abc"), "cba") self.assertEqual(Run("P↑abc"), "c\nb\na") self.assertEqual(Run("P→↓abc"), "abc\nb \nc ") self.assertEqual(Run("P+abc"), " c \n b \ncbabc\n b \n c ") self.assertEqual( Run("PK¦*****"), """\ * * * * * * ** * ** * * * * * *""") self.assertEqual(Run("Multiprint('abc')", verbose=True), "abc") self.assertEqual(Run("Multiprint(:Right, 'abc')", verbose=True), "abc") self.assertEqual(Run("Multiprint(:Down, 'abc')", verbose=True), "a\nb\nc") self.assertEqual(Run("Multiprint(:Left, 'abc')", verbose=True), "cba") self.assertEqual(Run("Multiprint(:Up, 'abc')", verbose=True), "c\nb\na") self.assertEqual(Run("Multiprint(:Right, :Down, 'abc')", verbose=True), "abc\nb \nc ") self.assertEqual(Run("Multiprint(:+, 'abc')", verbose=True), " c \n b \ncbabc\n b \n c ")
def test_rotate_copy(self): self.assertEqual(Run("abc¶de⟲C²"), """\ abc de c be ad""") self.assertEqual(Run("abc¶de⟲C⁴"), """\ abc de ed cba""") self.assertEqual(Run("abc¶de⟲C⁶"), """\ da abceb de c""") self.assertEqual(Run("abc↙M←de⟲C↙²"), """\ ce bdabc a de""") self.assertEqual(Run("abc↙M←de⟲C↙⁴"), """\ abc de ed cba """) self.assertEqual(Run("abc↙M←de⟲C↙⁶"), """\ abc de a db ec """) self.assertEqual(Run("abc↖M←de⟲C↖²"), """\ ec db a de abc""") self.assertEqual(Run("abc↖M←de⟲C↖⁴"), """\ cba ed de abc""") self.assertEqual(Run("abc↖M←de⟲C↖⁶"), """\ a de bdabc ce """) self.assertEqual(Run("de¶abc⟲C↗²"), """\ de c abceb da""") self.assertEqual(Run("de¶abc⟲C↗⁴"), """\ cba ed de abc """) self.assertEqual(Run("de¶abc⟲C↗⁶"), """\ ad be c de abc""") self.assertEqual(Run("Print('abc\\nde');RotateCopy(2)", verbose=True), """\ abc de c be ad""") self.assertEqual(Run("Print('abc\\nde');RotateCopy(4)", verbose=True), """\ abc de ed cba""") self.assertEqual(Run("Print('abc\\nde');RotateCopy(6)", verbose=True), """\ da abceb de c""") self.assertEqual( Run(""" Print('abc'); Move(:DownLeft); Move(:Left); Print('de'); RotateCopy(:DownLeft, 2)""", verbose=True), """\ ce bdabc a de""") self.assertEqual( Run(""" Print('abc'); Move(:DownLeft); Move(:Left); Print('de'); RotateCopy(:DownLeft, 4)""", verbose=True), """\ abc de ed cba """) self.assertEqual( Run(""" Print('abc'); Move(:DownLeft); Move(:Left); Print('de'); RotateCopy(:DownLeft, 6)""", verbose=True), """\ abc de a db ec """)