···11+(** Tests for [Gf256] — GF(2^8) finite field arithmetic.
22+33+ Vectors checked against the CCSDS 131.0-B-4 Annex F field (primitive
44+ polynomial x^8+x^7+x^2+x+1 = 0x187, primitive element 11). *)
55+66+module F = Reed_solomon.Gf256.Make (struct
77+ let primitive_poly = 0x187
88+ let primitive_element = 11
99+end)
1010+1111+let add_self_zero () =
1212+ for a = 0 to 255 do
1313+ Alcotest.(check int) (Fmt.str "%d + %d = 0" a a) 0 (F.add a a)
1414+ done
1515+1616+let sub_equals_add () =
1717+ for a = 0 to 255 do
1818+ for b = 0 to 255 do
1919+ Alcotest.check Alcotest.int (Fmt.str "sub %d %d" a b) (F.add a b)
2020+ (F.sub a b)
2121+ done
2222+ done
2323+2424+let mul_zero () =
2525+ for a = 0 to 255 do
2626+ Alcotest.(check int) (Fmt.str "0 * %d" a) 0 (F.mul 0 a);
2727+ Alcotest.(check int) (Fmt.str "%d * 0" a) 0 (F.mul a 0)
2828+ done
2929+3030+let mul_one () =
3131+ for a = 0 to 255 do
3232+ Alcotest.(check int) (Fmt.str "1 * %d" a) a (F.mul 1 a);
3333+ Alcotest.(check int) (Fmt.str "%d * 1" a) a (F.mul a 1)
3434+ done
3535+3636+let mul_commutative () =
3737+ for a = 1 to 255 do
3838+ for b = 1 to 255 do
3939+ Alcotest.(check int)
4040+ (Fmt.str "%d * %d = %d * %d" a b b a)
4141+ (F.mul a b) (F.mul b a)
4242+ done
4343+ done
4444+4545+let inv_roundtrip () =
4646+ for a = 1 to 255 do
4747+ let inv = F.inv a in
4848+ Alcotest.(check int) (Fmt.str "%d * inv %d = 1" a a) 1 (F.mul a inv)
4949+ done
5050+5151+let inv_zero_raises () =
5252+ Alcotest.check_raises "inv 0 raises"
5353+ (Invalid_argument "Gf256.inv: cannot invert zero") (fun () ->
5454+ ignore (F.inv 0))
5555+5656+let pow_zero_exponent () =
5757+ for a = 0 to 255 do
5858+ Alcotest.(check int) (Fmt.str "%d^0 = 1" a) 1 (F.pow a 0)
5959+ done
6060+6161+let pow_one_exponent () =
6262+ for a = 0 to 255 do
6363+ Alcotest.(check int) (Fmt.str "%d^1 = %d" a a) a (F.pow a 1)
6464+ done
6565+6666+let pow_negative () =
6767+ for a = 1 to 255 do
6868+ Alcotest.(check int) (Fmt.str "%d^-1 = inv %d" a a) (F.inv a) (F.pow a (-1))
6969+ done
7070+7171+let exp_table_size () =
7272+ Alcotest.(check int) "exp_table length" 512 (Array.length F.exp_table);
7373+ Alcotest.(check int) "exp_table[0]" 1 F.exp_table.(0)
7474+7575+let log_table_size () =
7676+ Alcotest.(check int) "log_table length" 256 (Array.length F.log_table)
7777+7878+let log_exp_inverse () =
7979+ for i = 0 to 254 do
8080+ let v = F.exp_table.(i) in
8181+ Alcotest.(check int) (Fmt.str "log(exp(%d)) = %d" i i) i F.log_table.(v)
8282+ done
8383+8484+let suite =
8585+ ( "gf256",
8686+ [
8787+ Alcotest.test_case "add self yields zero" `Quick add_self_zero;
8888+ Alcotest.test_case "sub equals add" `Quick sub_equals_add;
8989+ Alcotest.test_case "mul by zero" `Quick mul_zero;
9090+ Alcotest.test_case "mul by one" `Quick mul_one;
9191+ Alcotest.test_case "mul commutative" `Quick mul_commutative;
9292+ Alcotest.test_case "inv roundtrip" `Quick inv_roundtrip;
9393+ Alcotest.test_case "inv 0 raises" `Quick inv_zero_raises;
9494+ Alcotest.test_case "pow exponent 0" `Quick pow_zero_exponent;
9595+ Alcotest.test_case "pow exponent 1" `Quick pow_one_exponent;
9696+ Alcotest.test_case "pow negative" `Quick pow_negative;
9797+ Alcotest.test_case "exp_table size" `Quick exp_table_size;
9898+ Alcotest.test_case "log_table size" `Quick log_table_size;
9999+ Alcotest.test_case "log/exp inverse" `Quick log_exp_inverse;
100100+ ] )
+4
test/test_gf256.mli
···11+(** Tests for [Gf256]. *)
22+33+val suite : string * unit Alcotest.test_case list
44+(** [suite] is the alcotest suite for the [Gf256] functor. *)