diff options
Diffstat (limited to 'test/test_trick.rb')
-rw-r--r-- | test/test_trick.rb | 114 |
1 files changed, 99 insertions, 15 deletions
diff --git a/test/test_trick.rb b/test/test_trick.rb index e37bda2efe..c5c19d079e 100644 --- a/test/test_trick.rb +++ b/test/test_trick.rb @@ -1,6 +1,9 @@ +# frozen_string_literal: false + require "test/unit" require "ripper" require "envutil" +require "stringio" # This is a test suite for TRICK entries, joke Ruby program contest. # The programs are very unusual, and not practical. @@ -11,24 +14,24 @@ class TestTRICK2013 < Test::Unit::TestCase def test_kinaba src = File.join(__dir__, "../sample/trick2013/kinaba/entry.rb") expected = [*" ".."~"].join("") # all ASCII printables - assert_in_out_err(["-W0", src], "", [expected]) + assert_in_out_err(["-W0", "--disable-frozen-string-literal", src], "", [expected]) assert_equal(expected, File.read(src).chomp.chars.sort.join) end def test_mame src = File.join(__dir__, "../sample/trick2013/mame/entry.rb") ignore_dsp = "def open(_file, _mode); s = ''; def s.flush; self;end; yield s; end;" - assert_in_out_err(["-W0"], ignore_dsp + File.read(src), File.read(src).lines(chomp: true), timeout: 60) + assert_in_out_err(["-W0", "--disable-frozen-string-literal"], ignore_dsp + File.read(src), File.read(src).lines(chomp: true), timeout: 60) end def test_shinh src = File.join(__dir__, "../sample/trick2013/shinh/entry.rb") - assert_in_out_err(["-W0", src], "", []) + assert_in_out_err(["-W0", "--disable-frozen-string-literal", src], "", []) end def test_yhara src = File.join(__dir__, "../sample/trick2013/yhara/entry.rb") - assert_in_out_err(["-W0", src], "", ["JUST ANOTHER RUBY HACKER"]) + assert_in_out_err(["-W0", "--disable-frozen-string-literal", src], "", ["JUST ANOTHER RUBY HACKER"]) end end @@ -44,7 +47,7 @@ class TestTRICK2015 < Test::Unit::TestCase end pi = "3#{ a - b }" - assert_in_out_err(["-W0", src], "", [pi], timeout: 60) + assert_in_out_err(["-W0", "--disable-frozen-string-literal", src], "", [pi], timeout: 60) assert_equal(pi[0, 242], Ripper.tokenize(File.read(src)).grep(/\S/).map{|t|t.size%10}.join) end @@ -59,7 +62,7 @@ class TestTRICK2015 < Test::Unit::TestCase s << n.to_s end - assert_in_out_err(["-W0", src, "27"], "", s) + assert_in_out_err(["-W0", "--disable-frozen-string-literal", src, "27"], "", s) end def test_monae @@ -77,13 +80,13 @@ class TestTRICK2015 < Test::Unit::TestCase end expected = /\A#{ expected.map {|s| "#{ Regexp.quote(s) }\s*\n" }.join }\z/ - assert_in_out_err(["-W0", src], "", expected) + assert_in_out_err(["-W0", "--disable-frozen-string-literal", src], "", expected) end def test_eregon src = File.join(__dir__, "../sample/trick2015/eregon/entry.rb") - assert_in_out_err(["-W0", src], "", <<END.lines(chomp: true)) + assert_in_out_err(["-W0", "--disable-frozen-string-literal", src], "", <<END.lines(chomp: true)) 1 9 4 2 3 8 7 6 5 3 7 2 6 5 1 4 8 9 8 5 6 7 4 9 2 3 1 @@ -122,7 +125,7 @@ p cnf 3 5 1 3 0 END - assert_in_out_err(["-W0", src], inp, ["s SATISFIABLE", "v 1 2 -3"]) + assert_in_out_err(["-W0", "--disable-frozen-string-literal", src], inp, ["s SATISFIABLE", "v 1 2 -3"]) end end @@ -130,17 +133,17 @@ class TestTRICK2018 < Test::Unit::TestCase def test_01_kinaba src = File.join(__dir__, "../sample/trick2018/01-kinaba/entry.rb") - assert_in_out_err(["-W0", src], "", []) + assert_in_out_err(["-W0", "--disable-frozen-string-literal", src], "", []) end def test_02_mame src = File.join(__dir__, "../sample/trick2018/02-mame/entry.rb") ignore_sleep = "def sleep(_); end;" - assert_in_out_err(["-W0"], ignore_sleep + File.read(src)) do |stdout, _stderr, _status| + assert_in_out_err(["-W0", "--disable-frozen-string-literal"], ignore_sleep + File.read(src)) do |stdout, _stderr, _status| code = stdout.join("\n") + "\n" expected = code.lines(chomp: true) - assert_in_out_err(["-W0"], ignore_sleep + code, expected) + assert_in_out_err(["-W0", "--disable-frozen-string-literal"], ignore_sleep + code, expected) end end @@ -148,7 +151,7 @@ class TestTRICK2018 < Test::Unit::TestCase src = File.join(__dir__, "../sample/trick2018/03-tompng/entry.rb") # only syntax check because it requires chunky_png - assert_in_out_err(["-W0", "-c", src], "", ["Syntax OK"]) + assert_in_out_err(["-W0", "--disable-frozen-string-literal", "-c", src], "", ["Syntax OK"]) end def test_04_colin @@ -171,7 +174,7 @@ class TestTRICK2018 < Test::Unit::TestCase end end END - assert_in_out_err(["-W0"], code, <<END.lines(chomp: true), encoding: "UTF-8") + assert_in_out_err(["-W0", "--disable-frozen-string-literal"], code, <<END.lines(chomp: true), encoding: "UTF-8") Math Addition One plus one equals two. @@ -186,6 +189,87 @@ END src = File.join(__dir__, "../sample/trick2018/05-tompng/entry.rb") # only syntax check because it generates 3D model data - assert_in_out_err(["-W0", "-c", src], "", ["Syntax OK"]) + assert_in_out_err(["-W0", "--disable-frozen-string-literal", "-c", src], "", ["Syntax OK"]) + end +end + +class TestTRICK2022 < Test::Unit::TestCase + def test_01_tompng + src = File.join(__dir__, "../sample/trick2022/01-tompng/entry.rb") + + # only syntax check because it requires matrix + assert_in_out_err(["-W0", "--disable-frozen-string-literal", "-c", src], "", ["Syntax OK"]) + end + + def test_02_tompng + src = File.join(__dir__, "../sample/trick2022/02-tompng/entry.rb") + + # only syntax check because it works as a web server + assert_in_out_err(["-W0", "--disable-frozen-string-literal", "-c", src], "", ["Syntax OK"]) + end + + def test_03_mame + src = File.join(__dir__, "../sample/trick2022/03-mame/entry.rb") + + # TODO + assert_in_out_err(["-W0", "--disable-frozen-string-literal", "-c", src], "", ["Syntax OK"]) + end +end + +class TestRubyKaigi2023🥢 < Test::Unit::TestCase + CHOPSTICKS = [<<~'0', <<~'1'] # by mame + BEGIN{q=:Ruby};p||=:Enjoy;END{puts p,q||2023} + 0 + q=print(q||"/:|}\n")||p&&:@Matsumoto;p=:Kaigi + 1 + + def test_chopsticks_0 + assert_in_out_err(%w[-W0], CHOPSTICKS[0], %w[Enjoy Ruby]) + end + + def test_chopsticks_1 + assert_in_out_err(%w[-W0], CHOPSTICKS[1], %w[/:|}]) + end + + def test_chopsticks_0_1 + assert_in_out_err(%w[-W0], "#{CHOPSTICKS[0]}\n#{CHOPSTICKS[1]}", %w[RubyKaigi @Matsumoto]) + end + + def test_chopsticks_1_0 + assert_in_out_err(%w[-W0], "#{CHOPSTICKS[1]}\n#{CHOPSTICKS[0]}", %w[RubyKaigi 2023]) + end +end + +# https://github.com/mame/all-ruby-quine +class TestAllRubyQuine < Test::Unit::TestCase + def test_all_ruby_quine + stdout_bak = $stdout + $stdout = StringIO.new + verbose_bak = $VERBOSE + $VERBOSE = nil + src = File.read(File.join(__dir__, "../sample/all-ruby-quine.rb")) + + eval(src) + + out = $stdout.string.lines(chomp: true) + $stdout = stdout_bak + + # cheat OCR + font = { + "-" => 0x7ffffffffffe03fffffffffff, "." => 0x7fffffffffffffffffffc7f8f, "_" => 0x7fffffffffffffffffffff800, + "0" => 0x6030e03e07c0f81f03e038603, "1" => 0x70fc1f23fc7f8ff1fe3fc7c01, "2" => 0x4011f1fe3fc7e1f0f87c3f800, + "3" => 0x4031e3fe3f8e03fe3fe078c03, "4" => 0x783e0788e318e31c6003f1fe3, "5" => 0x0001fe3fc7f801fe1fe078401, + "6" => 0x78083e3fc7f8011e03e038401, "7" => 0x000fe1fc3f0fc3f0fc3f0fc3f, "8" => 0x4011f03e238e038e23e07c401, + "9" => 0x4010e03e03c400ff1fe078401, "a" => 0x7fffff00c787f88003e078408, "b" => 0x0ff1fe3fc408701f03e078001, + "c" => 0x7fffff8063c0ff1fe3fe3c601, "d" => 0x7f8ff1fe3004781f03e038408, + }.invert + out = (0...out.first.size / 15).map do |i| + font[(3..11).map {|j| out[j][i * 15 + 5, 11] }.join.gsub(/\S/, "#").tr("# ", "10").to_i(2)] + end.join + + assert_equal(RUBY_VERSION, out) + ensure + $stdout = stdout_bak + $VERBOSE = verbose_bak end end |