|
| 1 | +using Symbolics |
| 2 | + |
| 3 | +isapprox(x::Symbolics.Num, y::Symbolics.Num; rest...) = isequal(x, y) |
| 4 | + |
| 5 | +@testset "measurement" begin |
| 6 | + @variables x, x_err |
| 7 | + |
| 8 | + @test typeof(@inferred(measurement(x))) == Measurement{Num} |
| 9 | + @test typeof(@inferred(measurement(x, 0))) == Measurement{Num} |
| 10 | + @test typeof(@inferred(measurement(x, 1))) == Measurement{Num} |
| 11 | + @test typeof(@inferred(measurement(x, 0.0))) == Measurement{Num} |
| 12 | + @test typeof(@inferred(measurement(x, 1.0))) == Measurement{Num} |
| 13 | + @test typeof(@inferred(measurement(x, big(0)))) == Measurement{Num} |
| 14 | + @test typeof(@inferred(measurement(x, big(1)))) == Measurement{Num} |
| 15 | + @test typeof(@inferred(measurement(x, x_err))) == Measurement{Num} |
| 16 | + @test typeof(@inferred(measurement(0, x_err))) == Measurement{Num} |
| 17 | + @test typeof(@inferred(measurement(0.0, x_err))) == Measurement{Num} |
| 18 | + @test typeof(@inferred(measurement(big(0), x_err))) == Measurement{Num} |
| 19 | + |
| 20 | + @test iszero(@inferred(measurement(x)).err) |
| 21 | + @test @inferred(measurement(x)).tag === UInt64(0) |
| 22 | + @test length(@inferred(measurement(x)).der) == 0 |
| 23 | + @test !(@inferred(measurement(x, x_err)).tag === UInt64(0)) |
| 24 | + @test length(@inferred(measurement(x, 0)).der) == 0 |
| 25 | + @test length(@inferred(measurement(x, x_err)).der) == 1 |
| 26 | +end |
| 27 | + |
| 28 | +@testset "Type representation" begin |
| 29 | + @variables x_val, x_err |
| 30 | + |
| 31 | + x = measurement(x_val, x_err) |
| 32 | + |
| 33 | + # test pretty printing at the REPL |
| 34 | + @test_throws ErrorException repr(x, context=:error_digits=>-4) |
| 35 | + @test repr(x) == "x_val ± x_err" |
| 36 | + @test repr(x, context=:compact=>true) == "x_val±x_err" |
| 37 | + for error_digits in (0, 7) |
| 38 | + @test repr(x, context=:error_digits=>error_digits) == "x_val ± x_err" |
| 39 | + @test repr(x, context=IOContext(stdout, :error_digits=>error_digits, :compact=>true)) == "x_val±x_err" |
| 40 | + end |
| 41 | + |
| 42 | + @test repr("text/plain", x) == "x_val ± x_err" |
| 43 | + @test repr("text/plain", x, context=:compact=>true) == "x_val±x_err" |
| 44 | + for error_digits in (0, 7) |
| 45 | + @test repr("text/plain", x, context=:error_digits=>error_digits) == "x_val ± x_err" |
| 46 | + @test repr("text/plain", x, context=IOContext(stdout, :error_digits=>error_digits, :compact=>true)) == "x_val±x_err" |
| 47 | + end |
| 48 | + |
| 49 | + @test repr("text/latex", x) == "\$x_val \\pm x_err\$" |
| 50 | + @test repr("text/latex", x, context=:compact=>true) == "\$x_val\\pmx_err\$" |
| 51 | + for error_digits in (0, 7) |
| 52 | + @test repr("text/latex", x, context=:error_digits=>error_digits) == "\$x_val \\pm x_err\$" |
| 53 | + @test repr("text/latex", x, context=IOContext(stdout, :error_digits=>error_digits, :compact=>true)) == "\$x_val\\pmx_err\$" |
| 54 | + end |
| 55 | + |
| 56 | + for mime in ("text/x-tex", "text/x-latex") |
| 57 | + @test repr(mime, x) == "x_val \\pm x_err" |
| 58 | + @test repr(mime, x, context=:compact=>true) == "x_val\\pmx_err" |
| 59 | + for error_digits in (0, 7) |
| 60 | + @test repr(mime, x, context=:error_digits=>error_digits) == "x_val \\pm x_err" |
| 61 | + @test repr(mime, x, context=IOContext(stdout, :error_digits=>error_digits, :compact=>true)) == "x_val\\pmx_err" |
| 62 | + end |
| 63 | + end |
| 64 | +end |
| 65 | + |
| 66 | +##### Mathematical Operations |
| 67 | +@testset "Addition" begin |
| 68 | + @variables x_val, x_err, y_val, y_err |
| 69 | + |
| 70 | + x = measurement(x_val, x_err) |
| 71 | + y = measurement(y_val, y_err) |
| 72 | + |
| 73 | + # abs2(v) === abs(x)^2, but maybe faster. |
| 74 | + @test @inferred(x + y) ≈ measurement(x_val + y_val, sqrt(abs2(x_err) + abs2(y_err))) |
| 75 | +end |
0 commit comments