|
130 | 130 | @test ex(x1_val, x2_val).valid == false |
131 | 131 | end |
132 | 132 |
|
| 133 | +@testitem "ValidVector helpful error messages" tags = [:part2] begin |
| 134 | + using SymbolicRegression |
| 135 | + using SymbolicRegression: ValidVector, ValidVectorMixError, ValidVectorAccessError |
| 136 | + |
| 137 | + vv = ValidVector([1.0, 2.0], true) |
| 138 | + v = [3.0, 4.0] |
| 139 | + |
| 140 | + # Helper function to get error message |
| 141 | + get_error_msg(err) = |
| 142 | + let io = IOBuffer() |
| 143 | + Base.showerror(io, err) |
| 144 | + String(take!(io)) |
| 145 | + end |
| 146 | + |
| 147 | + # Test vector arithmetic errors encourage ValidVector wrapping |
| 148 | + err_mix = @test_throws ValidVectorMixError vv + v |
| 149 | + @test_throws ValidVectorMixError v * vv # Test other direction too |
| 150 | + |
| 151 | + mix_msg = get_error_msg(err_mix.value) |
| 152 | + @test contains( |
| 153 | + mix_msg, |
| 154 | + "ValidVector handles validity checks, auto-vectorization, and batching in template expressions", |
| 155 | + ) |
| 156 | + |
| 157 | + # Test array access errors mention .x and .valid |
| 158 | + err_access = @test_throws ValidVectorAccessError vv[1] |
| 159 | + @test_throws ValidVectorAccessError length(vv) |
| 160 | + @test_throws ValidVectorAccessError push!(vv, 5.0) |
| 161 | + |
| 162 | + access_msg = get_error_msg(err_access.value) |
| 163 | + @test contains(access_msg, "valid_ar.x[1]") |
| 164 | + @test contains(access_msg, "valid_ar.valid") |
| 165 | + @test contains(access_msg, "length(valid_ar.x)") |
| 166 | + @test contains(access_msg, "doesn't support direct array operations") |
| 167 | + @test contains(access_msg, "ValidVector handles validity/batching automatically") |
| 168 | +end |
| 169 | + |
133 | 170 | @testitem "Test Number inputs" tags = [:part2] begin |
134 | 171 | using SymbolicRegression: ComposableExpression, Node, ValidVector |
135 | 172 | using DynamicExpressions: OperatorEnum |
|
0 commit comments