230 lines
5.8 KiB
Rust
230 lines
5.8 KiB
Rust
use std::f64::consts::{E, PI, SQRT_2};
|
|
use ytbn_graphing_software::symbolic::try_symbolic;
|
|
|
|
#[test]
|
|
fn exact_pi() {
|
|
let result = try_symbolic(PI);
|
|
assert!(result.is_some());
|
|
let sym = result.unwrap();
|
|
assert_eq!(sym.to_string(), "pi");
|
|
}
|
|
|
|
#[test]
|
|
fn multiples_of_pi() {
|
|
// 2*pi
|
|
let result = try_symbolic(2.0 * PI);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "2pi");
|
|
|
|
// 3*pi
|
|
let result = try_symbolic(3.0 * PI);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "3pi");
|
|
|
|
// -pi
|
|
let result = try_symbolic(-PI);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "-pi");
|
|
|
|
// -2*pi
|
|
let result = try_symbolic(-2.0 * PI);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "-2pi");
|
|
}
|
|
|
|
#[test]
|
|
fn fractions_of_pi() {
|
|
// pi/2
|
|
let result = try_symbolic(PI / 2.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "pi/2");
|
|
|
|
// pi/3
|
|
let result = try_symbolic(PI / 3.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "pi/3");
|
|
|
|
// pi/4
|
|
let result = try_symbolic(PI / 4.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "pi/4");
|
|
|
|
// pi/6
|
|
let result = try_symbolic(PI / 6.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "pi/6");
|
|
|
|
// 2pi/3
|
|
let result = try_symbolic(2.0 * PI / 3.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "2pi/3");
|
|
|
|
// 3pi/4
|
|
let result = try_symbolic(3.0 * PI / 4.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "3pi/4");
|
|
|
|
// 5pi/6
|
|
let result = try_symbolic(5.0 * PI / 6.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "5pi/6");
|
|
|
|
// -pi/2
|
|
let result = try_symbolic(-PI / 2.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "-pi/2");
|
|
}
|
|
|
|
#[test]
|
|
fn exact_e() {
|
|
let result = try_symbolic(E);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "e");
|
|
}
|
|
|
|
#[test]
|
|
fn multiples_of_e() {
|
|
// 2e
|
|
let result = try_symbolic(2.0 * E);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "2e");
|
|
|
|
// -e
|
|
let result = try_symbolic(-E);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "-e");
|
|
}
|
|
|
|
#[test]
|
|
fn sqrt_2() {
|
|
let result = try_symbolic(SQRT_2);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "sqrt(2)");
|
|
|
|
// -sqrt(2)
|
|
let result = try_symbolic(-SQRT_2);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "-sqrt(2)");
|
|
|
|
// 2*sqrt(2)
|
|
let result = try_symbolic(2.0 * SQRT_2);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "2sqrt(2)");
|
|
}
|
|
|
|
#[test]
|
|
fn sqrt_3() {
|
|
let sqrt_3 = 3.0_f64.sqrt();
|
|
let result = try_symbolic(sqrt_3);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "sqrt(3)");
|
|
|
|
// sqrt(3)/2 - common in trigonometry
|
|
let result = try_symbolic(sqrt_3 / 2.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "sqrt(3)/2");
|
|
}
|
|
|
|
#[test]
|
|
fn simple_fractions() {
|
|
// 1/2
|
|
let result = try_symbolic(0.5);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "1/2");
|
|
|
|
// 1/3
|
|
let result = try_symbolic(1.0 / 3.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "1/3");
|
|
|
|
// 2/3
|
|
let result = try_symbolic(2.0 / 3.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "2/3");
|
|
|
|
// 1/4
|
|
let result = try_symbolic(0.25);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "1/4");
|
|
|
|
// 3/4
|
|
let result = try_symbolic(0.75);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "3/4");
|
|
|
|
// -1/2
|
|
let result = try_symbolic(-0.5);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "-1/2");
|
|
}
|
|
|
|
#[test]
|
|
fn integers() {
|
|
// 0
|
|
let result = try_symbolic(0.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "0");
|
|
|
|
// 1
|
|
let result = try_symbolic(1.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "1");
|
|
|
|
// -1
|
|
let result = try_symbolic(-1.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "-1");
|
|
|
|
// 5
|
|
let result = try_symbolic(5.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "5");
|
|
}
|
|
|
|
#[test]
|
|
fn non_symbolic_values() {
|
|
// Some arbitrary irrational number that isn't special
|
|
let result = try_symbolic(1.234567890123);
|
|
assert!(result.is_none());
|
|
|
|
// A number that's close to but not quite pi
|
|
let result = try_symbolic(3.15);
|
|
assert!(result.is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn numeric_value() {
|
|
// SymbolicValue should provide the original numeric value
|
|
let sym = try_symbolic(PI).unwrap();
|
|
assert!((sym.numeric_value() - PI).abs() < 1e-10);
|
|
|
|
let sym = try_symbolic(PI / 2.0).unwrap();
|
|
assert!((sym.numeric_value() - PI / 2.0).abs() < 1e-10);
|
|
}
|
|
|
|
#[test]
|
|
fn zero() {
|
|
let result = try_symbolic(0.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "0");
|
|
|
|
// Also test -0.0
|
|
let result = try_symbolic(-0.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "0");
|
|
}
|
|
|
|
#[test]
|
|
fn special_trig_values() {
|
|
// Common values that appear in trigonometry
|
|
// sin(pi/4) = cos(pi/4) = sqrt(2)/2
|
|
let result = try_symbolic(SQRT_2 / 2.0);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "sqrt(2)/2");
|
|
|
|
// sin(pi/6) = cos(pi/3) = 1/2
|
|
let result = try_symbolic(0.5);
|
|
assert!(result.is_some());
|
|
assert_eq!(result.unwrap().to_string(), "1/2");
|
|
}
|