From eac235e3da6d2246b545cc6656a1f5b6f46f9abd Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 11 May 2023 16:14:54 -0600 Subject: [PATCH] bitstring concat test cases --- libs/vdk/test/cases/testgen/bits.erl | 79 ++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 10 deletions(-) diff --git a/libs/vdk/test/cases/testgen/bits.erl b/libs/vdk/test/cases/testgen/bits.erl index b7b4053..2d14938 100644 --- a/libs/vdk/test/cases/testgen/bits.erl +++ b/libs/vdk/test/cases/testgen/bits.erl @@ -3,21 +3,80 @@ -compile([export_all, nowarn_export_all]). -empty() -> - <<>>. - -rand_bit() -> - case rand:uniform(2) of - 1 -> <<0:1>>; - 2 -> <<1:1>> - end. - rand_bits(N) when N =< 8 -> <> = rand:bytes(1), - <>. + <>; rand_bits(N) when N > 8 -> Num_Bytes = N div 8, Num_Trailing_Bits = N rem 8, <<( rand_bits(Num_Trailing_Bits) )/bits, ( rand:bytes(Num_Bytes) )/binary>>. + + +fmt(Bits) -> + io:format("~ts~n", [format_bits(Bits)]). + + + +format_bits(Bits) -> + ["<<", format_bits2(Bits), ">>"]. + + +format_bits2(Bits) when 8 =< bit_size(Bits) -> + NBits = bit_size(Bits), + NBytes = NBits div 8, + NRem = NBits rem 8, + <> = Bits, + case NRem of + 0 -> + format_bytes(Bytes); + _ -> + [format_bytes(Bytes), ", ", format_bits2(NewBits)] + end; +format_bits2(Bits = <>) when 5 =< bit_size(Bits) -> + [format_bits2(Start), "_", format_bits2(Rem)]; +format_bits2(Bits = <>) when 1 =< bit_size(Bits) -> + case B of + 0 -> + ["0", format_bits2(Rest)]; + 1 -> + ["1", format_bits2(Rest)] + end; +format_bits2(<<>>) -> + []. + + +%% hack: split into two groups of 4 bits +format_bytes(<>) -> + [format_bits2(A), "_", format_bits2(B)]; +%% byte_size(Rest) >= 1 by previous case +format_bytes(<>) -> + [format_bytes(N), ", ", format_bytes(Rest)]; +format_bytes(<<>>) -> + []. + + + +%% ten random cases for each pair of bit lengths, 0 =< N =< 8 +rand_cases() -> + rand_cases(0, 0, []). + +%% ten random cases for +rand_cases(8, 8, Acc) -> + [ten_cases(8, 8) | Acc]; +rand_cases(N, 8, Acc) -> + NewAcc = [ten_cases(N, 8) | Acc], + rand_cases(N + 1, 0, NewAcc); +rand_cases(N, M, Acc) -> + rand_cases(N, M + 1, [ten_cases(N, M) | Acc]). + + +ten_cases(N, M) -> + [cs(N, M) || _ <- lists:seq(1, 10)]. + +cs(N, M) -> + A = rand_bits(N), + B = rand_bits(M), + C = <>, + {A, B, C}.