local Vector3 = require("worldeditadditions_core.utils.vector3")

local facing_dirs = dofile("./.tests/parse/axes/include_facing_dirs.lua")

local axes = require("worldeditadditions_core.utils.parse.axes")
local parse_relative_axis_name = axes.parse_relative_axis_name



describe("parse_relative_axis_name", function()
	it("should work with up", function()
		local success, result = parse_relative_axis_name(
			"up",
			facing_dirs.x_pos
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(0, 1, 0),
			result
		)
	end)
	it("should work with down", function()
		local success, result = parse_relative_axis_name(
			"down",
			facing_dirs.x_pos
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(0, -1, 0),
			result
		)
	end)
	
	-- ██   ██         ██████   ██████  ███████
	--  ██ ██          ██   ██ ██    ██ ██
	--   ███           ██████  ██    ██ ███████
	--  ██ ██          ██      ██    ██      ██
	-- ██   ██ ███████ ██       ██████  ███████
	it("should work with positive x → front", function()
		local success, result = parse_relative_axis_name(
			"front",
			facing_dirs.x_pos
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(1, 0, 0),
			result
		)
	end)
	it("should work with positive x → ?", function()
		local success, result = parse_relative_axis_name(
			"?",
			facing_dirs.x_pos
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(1, 0, 0),
			result
		)
	end)
	it("should work with positive x → back", function()
		local success, result = parse_relative_axis_name(
			"back",
			facing_dirs.x_pos
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(-1, 0, 0),
			result
		)
	end)
	it("should work with positive x → left", function()
		local success, result = parse_relative_axis_name(
			"left",
			facing_dirs.x_pos
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(0, 0, 1),
			result
		)
	end)
	it("should work with positive x → right", function()
		local success, result = parse_relative_axis_name(
			"right",
			facing_dirs.x_pos
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(0, 0, -1),
			result
		)
	end)
	
	
	-- ██   ██         ███    ██ ███████  ██████
	--  ██ ██          ████   ██ ██      ██
	--   ███           ██ ██  ██ █████   ██   ███
	--  ██ ██          ██  ██ ██ ██      ██    ██
	-- ██   ██ ███████ ██   ████ ███████  ██████
	it("should work with negative x → front", function()
		local success, result = parse_relative_axis_name(
			"front",
			facing_dirs.x_neg
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(-1, 0, 0),
			result
		)
	end)
	it("should work with negative x → ?", function()
		local success, result = parse_relative_axis_name(
			"?",
			facing_dirs.x_neg
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(-1, 0, 0),
			result
		)
	end)
	it("should work with negative x → back", function()
		local success, result = parse_relative_axis_name(
			"back",
			facing_dirs.x_neg
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(1, 0, 0),
			result
		)
	end)
	it("should work with negative x → left", function()
		local success, result = parse_relative_axis_name(
			"left",
			facing_dirs.x_neg
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(0, 0, -1),
			result
		)
	end)
	it("should work with negative x → right", function()
		local success, result = parse_relative_axis_name(
			"right",
			facing_dirs.x_neg
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(0, 0, 1),
			result
		)
	end)
	
	
	-- ███████         ██████   ██████  ███████
	--    ███          ██   ██ ██    ██ ██
	--   ███           ██████  ██    ██ ███████
	--  ███            ██      ██    ██      ██
	-- ███████ ███████ ██       ██████  ███████
	it("should work with positive z → front", function()
		local success, result = parse_relative_axis_name(
			"front",
			facing_dirs.z_pos
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(0, 0, 1),
			result
		)
	end)
	it("should work with positive z → ?", function()
		local success, result = parse_relative_axis_name(
			"?",
			facing_dirs.z_pos
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(0, 0, 1),
			result
		)
	end)
	it("should work with positive z → back", function()
		local success, result = parse_relative_axis_name(
			"back",
			facing_dirs.z_pos
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(0, 0, -1),
			result
		)
	end)
	it("should work with positive z → left", function()
		local success, result = parse_relative_axis_name(
			"left",
			facing_dirs.z_pos
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(-1, 0, 0),
			result
		)
	end)
	it("should work with positive z → right", function()
		local success, result = parse_relative_axis_name(
			"right",
			facing_dirs.z_pos
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(1, 0, 0),
			result
		)
	end)
	
	
	-- ███████         ███    ██ ███████  ██████
	--    ███          ████   ██ ██      ██
	--   ███           ██ ██  ██ █████   ██   ███
	--  ███            ██  ██ ██ ██      ██    ██
	-- ███████ ███████ ██   ████ ███████  ██████
	it("should work with negative z → front", function()
		local success, result = parse_relative_axis_name(
			"front",
			facing_dirs.z_neg
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(0, 0, -1),
			result
		)
	end)
	it("should work with negative z → ?", function()
		local success, result = parse_relative_axis_name(
			"?",
			facing_dirs.z_neg
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(0, 0, -1),
			result
		)
	end)
	it("should work with negative z → back", function()
		local success, result = parse_relative_axis_name(
			"back",
			facing_dirs.z_neg
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(0, 0, 1),
			result
		)
	end)
	it("should work with negative z → left", function()
		local success, result = parse_relative_axis_name(
			"left",
			facing_dirs.z_neg
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(1, 0, 0),
			result
		)
	end)
	it("should work with negative z → right", function()
		local success, result = parse_relative_axis_name(
			"right",
			facing_dirs.z_neg
		)
		assert.is_true(success)
		assert.are.same(
			Vector3.new(-1, 0, 0),
			result
		)
	end)
	
	
	
	it("returns an error with invalid input", function()
		local success, result = parse_relative_axis_name("cheese")
		assert.is_false(success)
		assert.are.same(
			"string",
			type(result)
		)
	end)
	it("returns an error with no input", function()
		local success, result = parse_relative_axis_name()
		assert.is_false(success)
		assert.are.same(
			"string",
			type(result)
		)
	end)
	it("returns an error with input of the wrong type", function()
		local success, result = parse_relative_axis_name(5)
		assert.is_false(success)
		assert.are.same(
			"string",
			type(result)
		)
	end)
	it("returns an error with input of the wrong type again", function()
		local success, result = parse_relative_axis_name({ "yay", "tests are very useful" })
		assert.is_false(success)
		assert.are.same(
			"string",
			type(result)
		)
	end)
end)
