From 869aff19338e474f003398aad0a251621df3517c Mon Sep 17 00:00:00 2001 From: Louis Pilfold Date: Tue, 30 Jun 2020 13:31:59 +0100 Subject: Fix crash with unmodified bit builder --- src/gleam/bit_builder.gleam | 2 +- src/gleam_stdlib.erl | 5 ++- test/gleam/bit_builder_test.gleam | 65 ++++++++++++++++++++++++++++++++ test/gleam/bit_string_builder_test.gleam | 58 ---------------------------- 4 files changed, 70 insertions(+), 60 deletions(-) create mode 100644 test/gleam/bit_builder_test.gleam delete mode 100644 test/gleam/bit_string_builder_test.gleam diff --git a/src/gleam/bit_builder.gleam b/src/gleam/bit_builder.gleam index c3c88b0..dc066ae 100644 --- a/src/gleam/bit_builder.gleam +++ b/src/gleam/bit_builder.gleam @@ -74,7 +74,7 @@ pub external fn concat(List(BitBuilder)) -> BitBuilder = /// Runs in constant time. /// pub external fn from_bit_string(BitString) -> BitBuilder = - "gleam_stdlib" "identity" + "gleam_stdlib" "wrap_list" /// Turns an builder into a bit string. /// diff --git a/src/gleam_stdlib.erl b/src/gleam_stdlib.erl index f84e658..fa5f8fd 100644 --- a/src/gleam_stdlib.erl +++ b/src/gleam_stdlib.erl @@ -11,7 +11,7 @@ string_pad/4, decode_tuple2/1, decode_map/1, bit_string_int_to_u32/1, bit_string_int_from_u32/1, bit_string_append/2, bit_string_part_/3, decode_bit_string/1, compile_regex/2, regex_match/2, regex_split/2, - regex_scan/2, base_decoded4/1]). + regex_scan/2, base_decoded4/1, wrap_list/1]). should_equal(Actual, Expected) -> ?assertEqual(Expected, Actual). should_not_equal(Actual, Expected) -> ?assertNotEqual(Expected, Actual). @@ -205,3 +205,6 @@ base_decoded4(S) -> try {ok, base64:decode(S)} catch error:badarith -> {error, nil} end. + +wrap_list(X) when is_list(X) -> X; +wrap_list(X) -> [X]. diff --git a/test/gleam/bit_builder_test.gleam b/test/gleam/bit_builder_test.gleam new file mode 100644 index 0000000..b1635e5 --- /dev/null +++ b/test/gleam/bit_builder_test.gleam @@ -0,0 +1,65 @@ +import gleam/should +import gleam/bit_builder + +pub fn builder_test() { + let data = bit_builder.from_bit_string(<<1>>) + |> bit_builder.append(<<2>>) + |> bit_builder.append(<<3>>) + |> bit_builder.prepend(<<0>>) + + data + |> bit_builder.to_bit_string + |> should.equal(<<0, 1, 2, 3>>) + + data + |> bit_builder.byte_size + |> should.equal(4) +} + +pub fn builder_with_strings_test() { + let data = bit_builder.from_bit_string(<<1>>) + |> bit_builder.append_string("2") + |> bit_builder.append_string("3") + |> bit_builder.prepend_string("0") + + data + |> bit_builder.to_bit_string + |> should.equal(<<"0":utf8, 1, "2":utf8, "3":utf8>>) + + data + |> bit_builder.byte_size + |> should.equal(4) +} + +pub fn builder_with_builders_test() { + let data = bit_builder.from_bit_string(<<1>>) + |> bit_builder.append_builder(bit_builder.from_bit_string(<<2>>)) + |> bit_builder.append_builder(bit_builder.from_bit_string(<<3>>)) + |> bit_builder.prepend_builder(bit_builder.from_bit_string(<<0>>)) + + data + |> bit_builder.to_bit_string + |> should.equal(<<0, 1, 2, 3>>) + + data + |> bit_builder.byte_size + |> should.equal(4) +} + +pub fn concat_test() { + [ + bit_builder.from_bit_string(<<1, 2>>), + bit_builder.from_bit_string(<<3, 4>>), + bit_builder.from_bit_string(<<5, 6>>), + ] + |> bit_builder.concat + |> bit_builder.to_bit_string + |> should.equal(<<1, 2, 3, 4, 5, 6>>) +} + +pub fn from_string_test() { + // Regression test: no additional modification of the builder + bit_builder.from_bit_string(<<>>) + |> bit_builder.to_bit_string + |> should.equal(<<>>) +} diff --git a/test/gleam/bit_string_builder_test.gleam b/test/gleam/bit_string_builder_test.gleam deleted file mode 100644 index 43e010a..0000000 --- a/test/gleam/bit_string_builder_test.gleam +++ /dev/null @@ -1,58 +0,0 @@ -import gleam/should -import gleam/bit_builder - -pub fn builder_test() { - let data = bit_builder.from_bit_string(<<1>>) - |> bit_builder.append(<<2>>) - |> bit_builder.append(<<3>>) - |> bit_builder.prepend(<<0>>) - - data - |> bit_builder.to_bit_string - |> should.equal(<<0, 1, 2, 3>>) - - data - |> bit_builder.byte_size - |> should.equal(4) -} - -pub fn builder_with_strings_test() { - let data = bit_builder.from_bit_string(<<1>>) - |> bit_builder.append_string("2") - |> bit_builder.append_string("3") - |> bit_builder.prepend_string("0") - - data - |> bit_builder.to_bit_string - |> should.equal(<<"0":utf8, 1, "2":utf8, "3":utf8>>) - - data - |> bit_builder.byte_size - |> should.equal(4) -} - -pub fn builder_with_builders_test() { - let data = bit_builder.from_bit_string(<<1>>) - |> bit_builder.append_builder(bit_builder.from_bit_string(<<2>>)) - |> bit_builder.append_builder(bit_builder.from_bit_string(<<3>>)) - |> bit_builder.prepend_builder(bit_builder.from_bit_string(<<0>>)) - - data - |> bit_builder.to_bit_string - |> should.equal(<<0, 1, 2, 3>>) - - data - |> bit_builder.byte_size - |> should.equal(4) -} - -pub fn concat_test() { - [ - bit_builder.from_bit_string(<<1, 2>>), - bit_builder.from_bit_string(<<3, 4>>), - bit_builder.from_bit_string(<<5, 6>>), - ] - |> bit_builder.concat - |> bit_builder.to_bit_string - |> should.equal(<<1, 2, 3, 4, 5, 6>>) -} -- cgit v1.2.3