mirror of
https://github.com/c-cube/linol.git
synced 2025-12-13 14:30:34 -05:00
git-subtree-dir: thirdparty/lsp git-subtree-split: aae6986391a8519de3da6a7a341f2bd3376e0d2f
180 lines
4.8 KiB
OCaml
180 lines
4.8 KiB
OCaml
open Stdune
|
|
module Bytes = BytesLabels
|
|
open Lev_fiber_util
|
|
module B = Bip_buffer
|
|
|
|
let%expect_test "is_empty" =
|
|
let len = 100 in
|
|
assert (B.is_empty (B.create (Bytes.create len) ~len));
|
|
[%expect {||}]
|
|
|
|
let%expect_test "read empty" =
|
|
let b = B.create (Bytes.create 0) ~len:1 in
|
|
assert (B.peek b = None);
|
|
[%expect {||}]
|
|
|
|
let peek_str b ~len =
|
|
match B.peek b with
|
|
| None -> assert false
|
|
| Some s ->
|
|
assert (s.len >= len);
|
|
printfn "Requested %d. Available %d" len s.len;
|
|
let get len =
|
|
let dst = Bytes.create len in
|
|
let src = B.buffer b in
|
|
Bytes.blit ~dst ~dst_pos:0 ~src ~src_pos:s.pos ~len;
|
|
Bytes.to_string dst
|
|
in
|
|
let peek = get len in
|
|
if len = s.len then printfn "Peek: %S" peek
|
|
else printfn "Peek: %S (full: %S)" peek (get s.len);
|
|
peek
|
|
|
|
let print b =
|
|
let pp_slice fmt (b, { B.Slice.pos; len }) =
|
|
Format.fprintf fmt "%S" (Bytes.sub_string b ~pos ~len)
|
|
in
|
|
Format.printf "%a@." (B.pp pp_slice) b
|
|
|
|
let write_str b src =
|
|
let len = String.length src in
|
|
match B.reserve b ~len with
|
|
| None -> assert false
|
|
| Some dst_pos ->
|
|
let dst = B.buffer b in
|
|
Bytes.blit_string ~dst ~dst_pos ~src ~src_pos:0 ~len;
|
|
B.commit b ~len
|
|
|
|
let%expect_test "bip buffers" =
|
|
let buf_size = 16 in
|
|
let b = B.create (Bytes.create buf_size) ~len:buf_size in
|
|
assert (B.is_empty b);
|
|
[%expect {| |}];
|
|
let () =
|
|
let mystr = "Test Foo|Bar" in
|
|
let mystr_len = String.length mystr in
|
|
write_str b mystr;
|
|
assert (B.length b = mystr_len)
|
|
in
|
|
[%expect {| |}];
|
|
(* Now we try to read 4 characters *)
|
|
let () =
|
|
let read_len = 8 in
|
|
print b;
|
|
B.junk b ~len:read_len
|
|
in
|
|
[%expect {|
|
|
"Test Foo|Bar" |}];
|
|
print b;
|
|
[%expect {|
|
|
"|Bar" |}]
|
|
|
|
let%expect_test "fill buffer" =
|
|
let str = "foo bar baz foo" in
|
|
let len = String.length str in
|
|
let b = B.create (Bytes.create len) ~len in
|
|
write_str b str;
|
|
let str' = peek_str b ~len in
|
|
assert (String.equal str str');
|
|
[%expect {|
|
|
Requested 15. Available 15
|
|
Peek: "foo bar baz foo" |}]
|
|
|
|
let%expect_test "reserve overflow" =
|
|
let buf_size = 16 in
|
|
let b = B.create (Bytes.create buf_size) ~len:buf_size in
|
|
let len = 17 in
|
|
(match B.reserve b ~len with None -> () | Some _ -> assert false);
|
|
[%expect {||}]
|
|
|
|
let%expect_test "unused space" =
|
|
let buf_size = 16 in
|
|
let half = buf_size / 2 in
|
|
let b = B.create (Bytes.create buf_size) ~len:buf_size in
|
|
let unused = B.unused_space b in
|
|
printfn "unused space: %d" unused;
|
|
[%expect {|
|
|
unused space: 16 |}];
|
|
assert (unused = buf_size);
|
|
write_str b (String.make half 'a');
|
|
assert (B.unused_space b = half);
|
|
write_str b (String.make (pred half) 'b');
|
|
B.junk b ~len:half;
|
|
let unused = B.unused_space b in
|
|
printfn "unused space: %d" unused;
|
|
assert (unused = 9);
|
|
[%expect {|
|
|
unused space: 9 |}];
|
|
let b = B.create (Bytes.create buf_size) ~len:buf_size in
|
|
write_str b (String.make half 'a');
|
|
assert (B.length b = half);
|
|
B.junk b ~len:1;
|
|
assert (B.length b = pred half);
|
|
let unused = B.unused_space b in
|
|
printfn "unused space: %d" unused;
|
|
assert (unused = 9);
|
|
[%expect {| unused space: 9 |}]
|
|
|
|
let blit ~src ~src_pos ~dst ~dst_pos ~len =
|
|
Bytes.blit ~src ~src_pos ~dst ~dst_pos ~len
|
|
|
|
let%expect_test "resize" =
|
|
let buf_size = 16 in
|
|
let b = B.create (Bytes.make buf_size '0') ~len:buf_size in
|
|
write_str b "00000";
|
|
print b;
|
|
[%expect {|
|
|
"00000" |}];
|
|
B.resize b blit (Bytes.make (buf_size * 2) '1') ~len:(buf_size * 2);
|
|
print b;
|
|
[%expect {|
|
|
"00000" |}]
|
|
|
|
let%expect_test "compression - a only" =
|
|
let buf_size = 8 in
|
|
let b = B.create (Bytes.make buf_size '0') ~len:buf_size in
|
|
write_str b "00000";
|
|
B.junk b ~len:2;
|
|
printfn "available: %d" (B.max_available b);
|
|
[%expect {| available: 3 |}];
|
|
B.compress b blit;
|
|
print b;
|
|
[%expect {|
|
|
"000" |}];
|
|
printfn "available: %d" (B.max_available b);
|
|
[%expect {|
|
|
available: 5 |}]
|
|
|
|
let%expect_test "compression - a & b" =
|
|
let buf_size = 8 in
|
|
let b = B.create (Bytes.make buf_size '0') ~len:buf_size in
|
|
write_str b (String.make 7 '1');
|
|
B.junk b ~len:6;
|
|
print b;
|
|
[%expect {| "1" |}];
|
|
write_str b (String.make 3 '2');
|
|
print b;
|
|
[%expect {| "1""222" |}];
|
|
printfn "available: %d" (B.max_available b);
|
|
[%expect {| available: 3 |}];
|
|
B.compress b blit;
|
|
printfn "available: %d" (B.max_available b);
|
|
[%expect {| available: 4 |}];
|
|
print b;
|
|
[%expect {| "1222" |}]
|
|
|
|
let%expect_test "reserve and commit b" =
|
|
let buf_size = 8 in
|
|
let b = B.create (Bytes.make buf_size '0') ~len:buf_size in
|
|
write_str b (String.make 4 '1');
|
|
write_str b (String.make 2 '1');
|
|
assert (B.reserve b ~len:4 = None);
|
|
B.junk b ~len:4;
|
|
print b;
|
|
[%expect {| "11" |}];
|
|
write_str b (String.make 3 '2');
|
|
print b;
|
|
[%expect {| "11""222" |}];
|
|
write_str b (String.make 1 '3');
|
|
print b;
|
|
[%expect {| "11""2223" |}]
|