cube-tube/test/tests.rb
2023-03-08 14:06:29 +11:00

178 lines
5 KiB
Ruby

# To run the tests: ./run_tests
#
# Available assertions:
# assert.true!
# assert.false!
# assert.equal!
# assert.exception!
# assert.includes!
# assert.not_includes!
# assert.int!
# + any that you define
#
# Powered by Dragon Test: https://github.com/DragonRidersUnite/dragon_test
return unless debug?
test :menu_text_for_setting_val do |args, assert|
assert.equal!(Menu.text_for_setting_val(true), "ON")
assert.equal!(Menu.text_for_setting_val(false), "OFF")
assert.equal!(Menu.text_for_setting_val("other"), "other")
end
test :out_of_bounds do |args, assert|
grid = {
x: 0,
y: 0,
w: 1280,
h: 720,
}
assert.true!(out_of_bounds?(grid, { x: -30, y: 30, w: 24, h: 24 }))
assert.true!(out_of_bounds?(grid, { x: 30, y: -50, w: 24, h: 24 }))
assert.false!(out_of_bounds?(grid, { x: 30, y: 30, w: 24, h: 24 }))
end
test :angle_for_dir do |args, assert|
assert.equal!(angle_for_dir(DIR_RIGHT), 0)
assert.equal!(angle_for_dir(DIR_LEFT), 180)
assert.equal!(angle_for_dir(DIR_UP), 90)
assert.equal!(angle_for_dir(DIR_DOWN), 270)
end
test :vel_from_angle do |args, assert|
it "calculates core four angles properly" do
assert.equal!(vel_from_angle(0, 5), [5.0, 0.0])
assert.equal!(vel_from_angle(90, 5).map { |v| v.round(2) }, [0.0, 5.0])
assert.equal!(vel_from_angle(180, 5).map { |v| v.round(2) }, [-5.0, 0.0])
assert.equal!(vel_from_angle(270, 5).map { |v| v.round(2) }, [0.0, -5.0])
end
it "calculates other values as expected" do
assert.equal!(vel_from_angle(12, 5).map { |v| v.round(2) }, [4.89, 1.04])
end
end
test :open_entity_to_hash do |args, assert|
it "strips OpenEntity keys" do
args.state.foo.bar = true
args.state.foo.biz = false
assert.equal!(open_entity_to_hash(args.state.foo), { bar: true, biz: false })
end
end
test :game_setting_settings_for_save do |args, assert|
it "joins hash keys and values" do
assert.equal!(GameSetting.settings_for_save({ fullscreen: true, sfx: false}), "fullscreen:true,sfx:false")
end
end
test :text do |args, assert|
it "returns the value for the passed in key" do
assert.equal!(text(:fullscreen), "Fullscreen")
end
it "raises when the key isn't present" do
assert.exception!(KeyError, "Key not found: :not_present") { text(:not_present) }
end
end
test :opposite_angle do |args, assert|
it "returns the diametrically opposed angle" do
assert.equal!(opposite_angle(0), 180)
assert.equal!(opposite_angle(180), 0)
assert.equal!(opposite_angle(360), 180)
assert.equal!(opposite_angle(90), 270)
assert.equal!(opposite_angle(270), 90)
end
end
test :add_to_angle do |args, assert|
it "returns the new angle on the circle" do
assert.equal!(add_to_angle(0, 30), 30)
assert.equal!(add_to_angle(0, -30), 330)
assert.equal!(add_to_angle(180, -30), 150)
assert.equal!(add_to_angle(320, 60), 20)
assert.equal!(add_to_angle(320, -60), 260)
end
end
test :percent_chance? do |args, assert|
it "returns false if the percent is 0" do
assert.false!(percent_chance?(0))
end
it "returns true if the percent is 100" do
assert.true!(percent_chance?(100))
end
it "returns a boolean" do
assert.true!([TrueClass, FalseClass].include?(percent_chance?(50).class))
end
end
test :collide do |args, assert|
it "calls the block for every intersection of the two collections" do
counter = 0
enemies = [{ x: 0, y: 0, w: 8, h: 8, type: :e}, { x: 8, y: 0, w: 8, h: 8, type: :e}]
# 2 enemies intersect with only 1 of these tiles
tiles = [{ x: 0, y: 0, w: 32, h: 32}, { x: 32, y: 0, w: 32, h: 32}]
collide(enemies, tiles) do |enemy, tile|
counter += 1
assert.equal!(enemy.type, :e)
end
assert.equal!(counter, 2)
end
it "has access to args in the block" do
args.state.detect = false
enemies = [{ x: 0, y: 0, w: 8, h: 8}]
tiles = [{ x: 0, y: 0, w: 32, h: 32}]
collide(enemies, tiles) do |enemy, tile|
args.state.detect = true
end
assert.true!(args.state.detect)
end
it "wraps non-arrays in an array" do
counter = 0
tiles = [{ x: 0, y: 0, w: 32, h: 32}, { x: 32, y: 0, w: 32, h: 32}]
# player only intersects with 1 tile
player = { x: 0, y: 0, w: 8, h: 8, type: :player}
collide(tiles, player) do |tile, player|
counter += 1
assert.equal!(player.type, :player)
end
assert.equal!(counter, 1)
end
end
test :mobile do |args, assert|
it "supports simulation setting" do
$gtk.args.state.simulate_mobile = true
assert.true!(mobile?)
$gtk.args.state.simulate_mobile = false
assert.false!(mobile?)
end
end
test :center_of do |args, assert|
it "returns a hash with the x and y coord of the center of the rectangle-ish object" do
assert.equal!(center_of({ x: 100, y: 100, w: 200, h: 250 }), { x: 200.0, y: 225.0 })
end
it "errors when the object isn't rectangle-ish" do
assert.exception!(StandardError, "entity does not have needed properties to find center; must have x, y, w, and h properties") do
center_of({ x: 100, h: 250 })
end
end
end
# add your tests here
run_tests