note
	description: "Summary description for {TEST_INTEGER_ARITHMETIC}."
	author: ""
	date: "$Date$"
	revision: "$Revision$"

class
	TEST_INTEGER_X_ARITHMETIC

inherit
	EQA_TEST_SET
	INTEGER_X_ARITHMETIC
		undefine
			default_create
		end

feature
	test_add_1
			-- Test integer addition cases, ++ +- -+ --, 0 sum
		local
			posone: INTEGER_X
			postwo: INTEGER_X
			negone: INTEGER_X
			negtwo: INTEGER_X
			ans: INTEGER_X
		do
			create posone.make_from_integer (1000)
			create postwo.make_from_integer (2000)
			create negone.make_from_integer (-1000)
			create negtwo.make_from_integer (-2000)
			ans := posone + postwo
			assert ("{INTEGER_X}.add test", ans.to_integer_32 = 1000 + 2000)
			ans := postwo + negone
			assert ("{INTEGER_X}.add test", ans.to_integer_32 = 2000 + -1000)
			ans := negone + postwo
			assert ("{INTEGER_X}.add test", ans.to_integer_32 = -1000 + 2000)
			ans := negone + negtwo
			assert ("{INTEGER_X}.add test", ans.to_integer_32 = -1000 + -2000)
			ans := posone + negone
			assert ("{INTEGER_X}.add test", ans.to_integer_32 = 1000 + -1000)
		end

	test_add_2
		local
			one: INTEGER_X
			two: INTEGER_X
			three: INTEGER_X
			expected: INTEGER_X
		do
			create one.make_limbs (6)
			create two.make_from_hex_string ("343bd97a 7e17702a 800c8f10 54ad58f6 1f07c505")
			create three.make_from_hex_string ("ffffffff ffffffff ffffffff ffffffff 7ffffffc")
			create expected.make_from_hex_string ("1343bd97a7e17702a800c8f1054ad58f59f07c501")
			add (one, two, three)
			assert ("test add 2", one ~ expected)
		end

	test_add_3
		local
			one: INTEGER_X
			two: INTEGER_X
			three: INTEGER_X
			expected: INTEGER_X
		do
			create one
			create two.make_from_hex_string ("a9993e364706816aba3e25717850c26c9cd0d89d")
			create three.make_from_hex_string ("8913681113524c02ac9b2b8777f53c1feb356bfbc122bf1970d1ccc8fc43f9bb8aec1812ee98e4a2")
			create expected.make_from_hex_string ("8913681113524c02ac9b2b8777f53c1feb356bfc6abbfd4fb7d84e33b6821f2d033cda7f8b69bd3f")
			add (one, two, three)
			assert ("test add 3", one ~ expected)
		end

	test_add_4
		local
			one: INTEGER_X
			two: INTEGER_X
			three: INTEGER_X
			expected: INTEGER_X
		do
			create one
			create two.make_from_hex_string ("-7231ea35689f4fd7ce163d502a7e14c99947e909fb2a9d7cad460fb337fae053af6e5a5419a6800c19f28b09a3a1f005621dd631b6d93fcc32e4e6069e76fb15")
			create three.make_from_hex_string ("1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
			create expected.make_from_hex_string ("1ff8dce15ca9760b02831e9c2afd581eb3666b816f604d5628352b9f04cc8051fac5091a5abe6597ff3e60d74f65c5e0ffa9de229ce4926c033cd1b19f9618904ea")
			add (one, two, three)
			assert ("test add 4", one ~ expected)
		end

	test_sub_1
		local
			one_three: INTEGER_X
			two: INTEGER_X
			expected: INTEGER_X
		do
			create one_three.make_from_hex_string ("014fae42 56ad0915 2a7b2b66 fe887b52 e06ffa35 d359cd33 14156137 564096ef 90eb9c01 9ee82ea9")
			create two.make_from_hex_string ("1")
			create expected.make_from_hex_string ("-014fae42 56ad0915 2a7b2b66 fe887b52 e06ffa35 d359cd33 14156137 564096ef 90eb9c01 9ee82ea8")
			sub (one_three, two, one_three)
			assert ("test sub 1", one_three ~ expected)
		end

	test_sub_2
		local
			one: INTEGER_X
			two: INTEGER_X
			three: INTEGER_X
			expected: INTEGER_X
		do
			create one
			create two.make_from_hex_string ("1429cb78799228669deb4a9025f308ab78be74ae")
			create three.make_from_hex_string ("-f7c5cdcb7d66c16bbf17e81de30488c02078684")
			create expected.make_from_hex_string ("23a628553168947d59dcc912042351377ac5fb32")
			sub (one, two, three)
			assert ("test sub 2", one ~ expected)
		end

	test_mul_1
		local
			one: INTEGER_X
			two: INTEGER_X
			three: INTEGER_X
			expected: INTEGER_X
		do
			create one.make_limbs (10)
			create two.make_limbs (5)
			create three.make_limbs (6)
			create expected.make_from_hex_string ("30f2de49 bab11556 78be37e5 d4205117 663c6cc5 5fd1e2bd 41b4a8fd 35ce30b2 07939fb8 c29af9f6")
			two.item [0] := 0x9f07c4ff
			two.item [1] := 0xd4ad58f1
			two.item [2] := 0x800c8f0e
			two.item [3] := 0x7e17702a
			two.item [4] := 0x343bd97a
			two.count := 5
			three.item [0] := 0xfb4ab80a
			three.item [1] := 0x2077ac6a
			three.item [2] := 0x5bdd4431
			three.item [3] := 0x6672da8e
			three.item [4] := 0xefe650c5
			three.count := 5
			mul (one, two, three)
			assert ("test mul 1", expected ~ one)
		end

	test_mul_2
		local
			one_three: INTEGER_X
			two: INTEGER_X
			expected: INTEGER_X
		do
			create one_three.make_limbs (6)
			create two.make_limbs (5)
			create expected.make_from_hex_string ("30f2de49 bab11556 78be37e5 d4205117 663c6cc5 5fd1e2bd 41b4a8fd 35ce30b2 07939fb8 c29af9f6")
			two.item [0] := 0x9f07c4ff
			two.item [1] := 0xd4ad58f1
			two.item [2] := 0x800c8f0e
			two.item [3] := 0x7e17702a
			two.item [4] := 0x343bd97a
			two.count := 5
			one_three.item [0] := 0xfb4ab80a
			one_three.item [1] := 0x2077ac6a
			one_three.item [2] := 0x5bdd4431
			one_three.item [3] := 0x6672da8e
			one_three.item [4] := 0xefe650c5
			one_three.count := 5
			mul (one_three, two, one_three)
			assert ("test mul 1", expected ~ one_three)
		end

	test_mul_3
		local
			one: INTEGER_X
			two: INTEGER_X
			three: INTEGER_X
			expected: INTEGER_X
		do
			create one
			create two.make_from_hex_string ("-e69e4c55 8d0e2ed0 10128582 48b54fe8 8e87802e c871b791 5347fc54 8fb749de 9bc6e6b7 1868a715 859bcde6 96d6f196 37ad0367 26bc4cea 65f0d20e 67321392")
			create three.make_from_hex_string ("000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff")
			create expected.make_from_hex_string ("-1cd3c98ab1a1c5da020250b04916a9fd11d0f005d90e36f22a68ff8a91f6e93bd378dcd6e30d14e2b0b379bcd2dade32c6f5a06ce4d7899d4cbe1a41cce642723ff1961b3aa72f1d12fefed7a7db74ab01771787fd1378e486eacb803ab7048b62164391948e79758ea7a64321969290e69c852fc98d943b3159a0f2df198cdec6e")
			mul (one, two, three)
			assert ("test mul 3", one ~ expected)
		end

	test_mul_2exp_1
		local
			one: INTEGER_X
			two: INTEGER_X
			expected: INTEGER_X
		do
			create one.make_limbs (7)
			create two.make_from_hex_string ("2 fe13c053 7bbc11ac aa07d793 de4e6d5e 5c94eee8")
			create expected.make_from_hex_string ("0000000b f84f014d eef046b2 a81f5e4f 7939b579 7253bba0")
			mul_2exp (one, two, 2)
			assert ("test mul 2exp 1", one ~ expected)
		end

	test_mul_2exp_2
		local
			one: INTEGER_X
			two: INTEGER_X
			expected: INTEGER_X
		do
			create one
			create two.make_from_hex_string ("8 00000000 00000000 00000000 00000000 00000000")
			create expected.make_from_hex_string ("8 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000")
			mul_2exp (one, two, 0x80)
			assert ("test mul 2exp 2", one ~ expected)
		end
end