mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
191 lines
5 KiB
Ruby
191 lines
5 KiB
Ruby
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), timeout: 60)
|
|
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], timeout: 60)
|
|
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, encoding: "UTF-8") + <<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), encoding: "UTF-8")
|
|
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
|