OCaml: StringBuffer of Buffer.t in sx_types.ml; 5 primitives in sx_primitives.ml (make-string-buffer, string-buffer?, string-buffer-append!, string-buffer->string, string-buffer-length); inspect case added. JS: SxStringBuffer with array+join backend; _string_buffer marker for typeOf dispatch and dict? exclusion (also excludes _vector from dict?). spec/primitives.sx: 5 define-primitive entries. 17/17 tests pass on both OCaml and JS. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
132 lines
4.3 KiB
Plaintext
132 lines
4.3 KiB
Plaintext
(defsuite
|
|
"string-buffer"
|
|
(deftest
|
|
"make-string-buffer creates a string-buffer"
|
|
(let ((buf (make-string-buffer))) (assert (string-buffer? buf))))
|
|
(deftest
|
|
"string-buffer? is false for non-buffers"
|
|
(assert= false (string-buffer? "hello"))
|
|
(assert= false (string-buffer? 42))
|
|
(assert= false (string-buffer? nil))
|
|
(assert= false (string-buffer? (list)))
|
|
(assert= false (string-buffer? {:key "val"})))
|
|
(deftest
|
|
"type-of returns string-buffer"
|
|
(assert= "string-buffer" (type-of (make-string-buffer))))
|
|
(deftest
|
|
"empty buffer converts to empty string"
|
|
(let
|
|
((buf (make-string-buffer)))
|
|
(assert= "" (string-buffer->string buf))))
|
|
(deftest
|
|
"empty buffer has length zero"
|
|
(let
|
|
((buf (make-string-buffer)))
|
|
(assert= 0 (string-buffer-length buf))))
|
|
(deftest
|
|
"single append accumulates string"
|
|
(let
|
|
((buf (make-string-buffer)))
|
|
(string-buffer-append! buf "hello")
|
|
(assert= "hello" (string-buffer->string buf))))
|
|
(deftest
|
|
"multiple appends join in order"
|
|
(let
|
|
((buf (make-string-buffer)))
|
|
(string-buffer-append! buf "foo")
|
|
(string-buffer-append! buf "bar")
|
|
(string-buffer-append! buf "baz")
|
|
(assert= "foobarbaz" (string-buffer->string buf))))
|
|
(deftest
|
|
"length tracks total bytes appended"
|
|
(let
|
|
((buf (make-string-buffer)))
|
|
(string-buffer-append! buf "abc")
|
|
(string-buffer-append! buf "de")
|
|
(assert= 5 (string-buffer-length buf))))
|
|
(deftest
|
|
"append returns nil"
|
|
(let
|
|
((buf (make-string-buffer)))
|
|
(assert= nil (string-buffer-append! buf "x"))))
|
|
(deftest
|
|
"appending empty string is harmless"
|
|
(let
|
|
((buf (make-string-buffer)))
|
|
(string-buffer-append! buf "start")
|
|
(string-buffer-append! buf "")
|
|
(string-buffer-append! buf "end")
|
|
(assert= "startend" (string-buffer->string buf))
|
|
(assert= 8 (string-buffer-length buf))))
|
|
(deftest
|
|
"buffer is still usable after string-buffer->string"
|
|
(let
|
|
((buf (make-string-buffer)))
|
|
(string-buffer-append! buf "hello")
|
|
(string-buffer->string buf)
|
|
(string-buffer-append! buf " world")
|
|
(assert= "hello world" (string-buffer->string buf))))
|
|
(deftest
|
|
"two buffers are independent"
|
|
(let
|
|
((b1 (make-string-buffer)) (b2 (make-string-buffer)))
|
|
(string-buffer-append! b1 "one")
|
|
(string-buffer-append! b2 "two")
|
|
(string-buffer-append! b1 "ONE")
|
|
(assert= "oneONE" (string-buffer->string b1))
|
|
(assert= "two" (string-buffer->string b2))))
|
|
(deftest
|
|
"loop building — linear string concat"
|
|
(let
|
|
((buf (make-string-buffer)))
|
|
(let
|
|
loop
|
|
((i 0))
|
|
(when
|
|
(< i 5)
|
|
(string-buffer-append! buf (str i))
|
|
(loop (+ i 1))))
|
|
(assert= "01234" (string-buffer->string buf))
|
|
(assert= 5 (string-buffer-length buf))))
|
|
(deftest
|
|
"building CSV row with separator"
|
|
(let
|
|
((buf (make-string-buffer)) (items (list "a" "b" "c" "d")))
|
|
(let
|
|
loop
|
|
((remaining items) (is-first true))
|
|
(when
|
|
(not (empty? remaining))
|
|
(when (not is-first) (string-buffer-append! buf ","))
|
|
(string-buffer-append! buf (first remaining))
|
|
(loop (rest remaining) false)))
|
|
(assert= "a,b,c,d" (string-buffer->string buf))))
|
|
(deftest
|
|
"unicode characters accumulate correctly"
|
|
(let
|
|
((buf (make-string-buffer)))
|
|
(string-buffer-append! buf "こんにちは")
|
|
(string-buffer-append! buf " ")
|
|
(string-buffer-append! buf "世界")
|
|
(assert= "こんにちは 世界" (string-buffer->string buf))))
|
|
(deftest
|
|
"repeated to-string calls are consistent"
|
|
(let
|
|
((buf (make-string-buffer)))
|
|
(string-buffer-append! buf "test")
|
|
(assert= (string-buffer->string buf) (string-buffer->string buf))))
|
|
(deftest
|
|
"building with join pattern produces correct output"
|
|
(let
|
|
((buf (make-string-buffer))
|
|
(words (list "the" "quick" "brown" "fox")))
|
|
(let
|
|
loop
|
|
((remaining words) (sep ""))
|
|
(when
|
|
(not (empty? remaining))
|
|
(string-buffer-append! buf sep)
|
|
(string-buffer-append! buf (first remaining))
|
|
(loop (rest remaining) " ")))
|
|
(assert= "the quick brown fox" (string-buffer->string buf)))))
|