Skip to content

Commit 240b2bf

Browse files
test(stdlib): add coverage for untested builtins - abs, chr/ord, len, map, type conversions, isinstance, bytes
Adds 15 new [<Fact>] tests for builtins that were bound in Builtins.fs but had no test coverage: - abs (int and float) - chr / ord (and round-trip) - len (list and string) - map (single and two-iterable overloads) - str / int / float type conversions - isinstance / type - bytes (from byte array and from string with encoding) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 09cb36b commit 240b2bf

2 files changed

Lines changed: 92 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ name: Fable.Python
77

88
All notable changes to this project will be documented in this file.
99

10+
## Unreleased
11+
12+
### 🧪 Tests
13+
14+
* *(stdlib)* Add tests for untested builtins: `abs`, `chr`/`ord`, `len`, `map`, type conversions (`str`/`int`/`float`), `isinstance`, `type`, `bytes`
15+
1016
## 5.1.0 - 2026-04-26
1117

1218
### 🚀 Features

test/TestBuiltins.fs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,89 @@ let ``test any works`` () =
6565
builtins.any [ false; false; true ] |> equal true
6666
builtins.any [ false; false; false ] |> equal false
6767
builtins.any [] |> equal false
68+
69+
[<Fact>]
70+
let ``test abs with int works`` () =
71+
builtins.abs -5 |> equal 5
72+
builtins.abs 0 |> equal 0
73+
builtins.abs 42 |> equal 42
74+
75+
[<Fact>]
76+
let ``test abs with float works`` () =
77+
builtins.abs -3.14 |> equal 3.14
78+
builtins.abs 0.0 |> equal 0.0
79+
builtins.abs 2.72 |> equal 2.72
80+
81+
[<Fact>]
82+
let ``test chr and ord round-trip works`` () =
83+
builtins.chr 65 |> equal 'A'
84+
builtins.chr 97 |> equal 'a'
85+
builtins.ord 'A' |> equal 65
86+
builtins.ord 'a' |> equal 97
87+
88+
[<Fact>]
89+
let ``test chr ord round-trip preserves value`` () =
90+
let code = 9731 // snowman ☃
91+
builtins.ord (builtins.chr code) |> equal code
92+
93+
[<Fact>]
94+
let ``test len with list works`` () =
95+
builtins.len ([ 1; 2; 3 ] |> box) |> equal 3
96+
builtins.len ([] |> box) |> equal 0
97+
98+
[<Fact>]
99+
let ``test len with string works`` () =
100+
builtins.len ("hello" |> box) |> equal 5
101+
builtins.len ("" |> box) |> equal 0
102+
103+
[<Fact>]
104+
let ``test map with single iterable works`` () =
105+
builtins.map ((fun x -> x * 2), [ 1; 2; 3 ])
106+
|> Seq.toList
107+
|> equal [ 2; 4; 6 ]
108+
109+
[<Fact>]
110+
let ``test map with two iterables works`` () =
111+
builtins.map ((fun (a, b) -> a + b), [ 1; 2; 3 ], [ 10; 20; 30 ])
112+
|> Seq.toList
113+
|> equal [ 11; 22; 33 ]
114+
115+
[<Fact>]
116+
let ``test str conversion works`` () =
117+
builtins.str 42 |> equal "42"
118+
builtins.str true |> equal "True"
119+
120+
[<Fact>]
121+
let ``test int conversion works`` () =
122+
builtins.int "42" |> equal 42
123+
builtins.int 3.9 |> equal 3
124+
125+
[<Fact>]
126+
let ``test float conversion works`` () =
127+
builtins.float "3.14" |> equal 3.14
128+
builtins.float 42 |> equal 42.0
129+
130+
[<Fact>]
131+
let ``test isinstance works`` () =
132+
builtins.isinstance ("hello", builtins.``type`` "hello") |> equal true
133+
builtins.isinstance (42, builtins.``type`` 42) |> equal true
134+
135+
[<Fact>]
136+
let ``test isinstance returns false for wrong type`` () =
137+
builtins.isinstance (42, builtins.``type`` "hello") |> equal false
138+
139+
[<Fact>]
140+
let ``test type returns type object`` () =
141+
let t = builtins.``type`` "hello"
142+
builtins.isinstance ("world", t) |> equal true
143+
builtins.isinstance (42, t) |> equal false
144+
145+
[<Fact>]
146+
let ``test bytes from byte array works`` () =
147+
let b = builtins.bytes [| 72uy; 101uy; 108uy; 108uy; 111uy |]
148+
builtins.len b |> equal 5
149+
150+
[<Fact>]
151+
let ``test bytes from string with encoding works`` () =
152+
let b = builtins.bytes ("ABC", "utf-8")
153+
builtins.len b |> equal 3

0 commit comments

Comments
 (0)