lean4-htt/tests/lean/run/byteslice.lean
Sofia Rodrigues a966ce64ca
feat: add useful functions in Parsec, add error variant and Std.Data.ByteSlice (#9599)
This PR adds the type `Std.Internal.Parsec.Error`, which contains the
constructors `.eof` (useful for checking if parsing failed due to not
having enough input and then retrying when more input arrives that is
useful in the HTTP server) and `.other`, which describes other errors.
It also adds documentation to many functions, along with some new
functions to the `ByteArray` Parsec, such as `peekWhen?`, `octDigit`,
`takeWhile`, `takeUntil`, `skipWhile`, and `skipUntil`.
2025-09-11 14:53:41 +00:00

343 lines
4.3 KiB
Text

import Std.Data.ByteSlice
-- Test data
def ba := ByteArray.mk #[1,2,3,4,5,6,7,8,9,10]
def bb := ByteArray.mk #[1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10]
def emptyArray := ByteArray.mk #[]
def singleByte := ByteArray.mk #[42]
-- Basic slicing tests (existing)
/--
info: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
-/
#guard_msgs in
#eval bb[10...20] |>.toByteArray
/--
info: [3, 4]
-/
#guard_msgs in
#eval bb[10...20][2...4] |>.toByteArray
/--
info: 4
-/
#guard_msgs in
#eval bb[10...20][2...4] |>.get! 1
/--
info: true
-/
#guard_msgs in
#eval bb[10...20][2...4] |>.contains 4
-- Size function tests
/--
info: 10
-/
#guard_msgs in
#eval ba.toByteSlice.size
/--
info: 0
-/
#guard_msgs in
#eval emptyArray.toByteSlice.size
/--
info: 1
-/
#guard_msgs in
#eval singleByte.toByteSlice.size
/--
info: 5
-/
#guard_msgs in
#eval ba[2...7].size
-- Element access tests
/--
info: 1
-/
#guard_msgs in
#eval ba[0...5][0]!
/--
info: 5
-/
#guard_msgs in
#eval ba[0...5][4]!
-- getD (get with default) tests
/--
info: 3
-/
#guard_msgs in
#eval ba.toByteSlice.getD 2 99
/--
info: 99
-/
#guard_msgs in
#eval ba.toByteSlice.getD 15 99
/--
info: 255
-/
#guard_msgs in
#eval emptyArray.toByteSlice.getD 0 255
-- get! tests (with bounds checking)
/--
info: 0
-/
#guard_msgs in
#eval ba.toByteSlice.get! 15
/--
info: 0
-/
#guard_msgs in
#eval emptyArray.toByteSlice.get! 0
/--
info: 42
-/
#guard_msgs in
#eval singleByte.toByteSlice.get! 0
-- Contains function tests
/--
info: true
-/
#guard_msgs in
#eval ba.toByteSlice.contains 5
/--
info: false
-/
#guard_msgs in
#eval ba.toByteSlice.contains 15
/--
info: false
-/
#guard_msgs in
#eval emptyArray.toByteSlice.contains 1
/--
info: true
-/
#guard_msgs in
#eval bb[5...15].contains 10
-- Equality tests
/--
info: true
-/
#guard_msgs in
#eval ba[0...5] == ba[0...5]
/--
info: true
-/
#guard_msgs in
#eval ba[0...3].toByteArray == bb[0...3].toByteArray
/--
info: false
-/
#guard_msgs in
#eval ba[0...3] == ba[1...4]
/--
info: true
-/
#guard_msgs in
#eval ByteSlice.empty == emptyArray.toByteSlice
-- Edge case: empty slices
/--
info: 0
-/
#guard_msgs in
#eval ByteSlice.empty.size
/--
info: []
-/
#guard_msgs in
#eval ByteSlice.empty.toByteArray
/--
info: false
-/
#guard_msgs in
#eval ByteSlice.empty.contains 0
-- Edge case: slice bounds clamping
/--
info: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
-/
#guard_msgs in
#eval ba[0...100].toByteArray
/--
info: []
-/
#guard_msgs in
#eval ba[100...200].toByteArray
/--
info: [6, 7, 8, 9, 10]
-/
#guard_msgs in
#eval ba[5...100].toByteArray
-- Foldr function tests
/--
info: 55
-/
#guard_msgs in
#eval ba.toByteSlice.foldr (fun b acc => b.toNat + acc) 0
/--
info: 0
-/
#guard_msgs in
#eval ByteSlice.empty.foldr (fun b acc => b.toNat + acc) 0
/--
info: 42
-/
#guard_msgs in
#eval singleByte.toByteSlice.foldr (fun b acc => b.toNat + acc) 0
-- Nested slicing with element access
/--
info: 7
-/
#guard_msgs in
#eval bb[0...10][5...8][1]!
/--
info: true
-/
#guard_msgs in
#eval bb[0...10][5...8].contains 6
/--
info: false
-/
#guard_msgs in
#eval bb[0...10][5...8].contains 5
-- Size consistency tests
/--
info: 3
-/
#guard_msgs in
#eval bb[0...10][5...8].size
/--
info: 5
-/
#guard_msgs in
#eval bb[5...15][0...5].size
-- Boundary testing with single elements
/--
info: [10]
-/
#guard_msgs in
#eval ba[9...10].toByteArray
/--
info: 1
-/
#guard_msgs in
#eval ba[9...10].size
/--
info: 10
-/
#guard_msgs in
#eval ba[9...10][0]!
-- Out of bounds slice handling
/--
info: []
-/
#guard_msgs in
#eval ba[15...20].toByteArray
/--
info: 0
-/
#guard_msgs in
#eval ba[15...20].size
/--
info: []
-/
#guard_msgs in
#eval ba.toByteSlice.slice 8 3 |>.toByteArray
/--
info: 0
-/
#guard_msgs in
#eval ba.toByteSlice.slice 8 3 |>.size
/--
info: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
-/
#guard_msgs in
#eval ba.toByteSlice.slice 0 10 |>.toByteArray
/--
info: true
-/
#guard_msgs in
#eval bb[0...10] == bb[10...20]
/--
info: [1, 2, 3]
-/
#guard_msgs in
#eval bb[10...13].toByteArray
-- Testing with different default values in getD
/--
info: 128
-/
#guard_msgs in
#eval ba[0...3].getD 10 128
/--
info: 2
-/
#guard_msgs in
#eval ba[0...3].getD 1 128
def maxByteArray := ByteArray.mk #[255, 0, 128, 1]
/--
info: true
-/
#guard_msgs in
#eval maxByteArray.toByteSlice.contains 255
/--
info: 384
-/
#guard_msgs in
#eval maxByteArray.toByteSlice.foldr (fun b acc => b.toNat + acc) 0
/--
info: [255, 0]
-/
#guard_msgs in
#eval maxByteArray[0...2].toByteArray