diff options
author | Yusuke Endoh <mame@ruby-lang.org> | 2020-12-25 15:22:37 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-25 15:22:37 +0900 |
commit | 09216f63ba29b777beda6d4691eb8067af0af5e2 (patch) | |
tree | c24e3a8bb9d5483d3cc4b1d8a6f9f69cb938e3cd /test/test_trick.rb | |
parent | 6a0bbc55b64e576afe46672625909971663c48e0 (diff) | |
download | ruby-09216f63ba29b777beda6d4691eb8067af0af5e2.tar.gz |
test/test_trick.rb: Add a test file for TRICK entries (#3988)
* test/test_trick.rb: Add a test file for TRICK entries
Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
Diffstat (limited to 'test/test_trick.rb')
-rw-r--r-- | test/test_trick.rb | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/test/test_trick.rb b/test/test_trick.rb new file mode 100644 index 0000000000..c61a53f7b6 --- /dev/null +++ b/test/test_trick.rb @@ -0,0 +1,191 @@ +require "test/unit" +require "ripper" +require "envutil" + +# This is a test suite for TRICK entries, joke Ruby program contest. +# The programs are very unusual, and not practical. +# Feel free to comment them out if they bother you. +# I'll appreciate it if you could notify mame <mame@ruby-lang.org> + +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_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)) + end + + def test_shinh + src = File.join(__dir__, "../sample/trick2013/shinh/entry.rb") + assert_in_out_err(["-W0", src], "", []) + end + + def test_yhara + src = File.join(__dir__, "../sample/trick2013/yhara/entry.rb") + assert_in_out_err(["-W0", src], "", ["JUST ANOTHER RUBY HACKER"]) + end +end + +class TestTRICK2015 < Test::Unit::TestCase + def test_kinaba + src = File.join(__dir__, "../sample/trick2015/kinaba/entry.rb") + + # calculate the first 10000 digits of Pi + n = 10000 + a = b = 10 ** n + (n * 8 + 1).step(3, -2) do |i| + a = (i / 2) * (a + b * 2) / i + end + pi = "3#{ a - b }" + + assert_in_out_err(["-W0", src], "", [pi]) + assert_equal(pi[0, 242], Ripper.tokenize(File.read(src)).grep(/\S/).map{|t|t.size%10}.join) + end + + def test_ksk_1 + src = File.join(__dir__, "../sample/trick2015/ksk_1/entry.rb") + + # calculate Collatz sequence + s = ["27"] + n = 27 + until n == 1 + n = n.even? ? n / 2 : n * 3 + 1 + s << n.to_s + end + + assert_in_out_err(["-W0", src, "27"], "", s) + end + + def test_monae + src = File.join(__dir__, "../sample/trick2015/monae/entry.rb") + + code = File.read(src) + expected = code.lines(chomp: true) + (0..15).map { "" } + code.lines.each_with_index do |s, y| + y += 16 + s.chomp.chars.each_with_index do |c, x| + x += 16 + expected[y] << " " while expected[y].size < x + expected[y][x] = c if c != " " + end + end + expected = /\A#{ expected.map {|s| "#{ Regexp.quote(s) }\s*\n" }.join }\z/ + + assert_in_out_err(["-W0", 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)) +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 +7 8 1 3 6 4 5 9 2 +4 2 3 9 7 5 8 1 6 +5 6 9 8 1 2 3 7 4 +6 4 8 1 2 7 9 5 3 +9 3 5 4 8 6 1 2 7 +2 1 7 5 9 3 6 4 8 + +1 9 7 2 3 8 4 6 5 +3 4 2 6 5 1 7 8 9 +8 5 6 7 4 9 2 3 1 +7 1 8 3 6 4 5 9 2 +4 2 3 9 7 5 8 1 6 +5 6 9 8 1 2 3 7 4 +6 8 4 1 2 7 9 5 3 +9 3 5 4 8 6 1 2 7 +2 7 1 5 9 3 6 4 8 + +END + end + + def test_ksk_2 + src = File.join(__dir__, "../sample/trick2015/ksk_2/entry.rb") + + inp = <<END +c +c This is a sample input file. +c +p cnf 3 5 + 1 -2 3 0 +-1 2 0 +-2 -3 0 + 1 2 -3 0 + 1 3 0 +END + + assert_in_out_err(["-W0", src], inp, ["s SATISFIABLE", "v 1 2 -3"]) + end +end + +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], "", []) + 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| + code = stdout.join("\n") + "\n" + expected = code.lines(chomp: true) + assert_in_out_err(["-W0"], ignore_sleep + code, expected) + end + end + + def test_03_tompng + 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"]) + end + + def test_04_colin + src = File.join(__dir__, "../sample/trick2018/04-colin/entry.rb") + + code = "# encoding: UTF-8\n" + File.read(src) + <<END +\u{1F914} "Math" do + \u{1F914} "Addition" do + \u{1F914} "One plus one equals two.", + 1+1 == 2 + \u{1F914} "One plus one equals eleven. (This should fail.)", + 1+1 == 11 + end + + \u{1F914} "Subtraction" do + \u{1F914} "One minus one equals zero.", + 1-1 == 0 + \u{1F914} "Ten minus one equal nine.", + 10-1 == 9 + end +end +END + assert_in_out_err(["-W0"], code, <<END.lines(chomp: true)) +Math + Addition + One plus one equals two. + \u{1F6AB} One plus one equals eleven. (This should fail.) + Subtraction + One minus one equals zero. + Ten minus one equal nine. +END + end + + def test_05_tompng + 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"]) + end +end |