use tokitai_operator::domain::{Padic, PadicDomain};
use tokitai_operator::object::{Dim, Shape, Tensor};
#[test]
fn dim_display_covers_all_variants() {
assert_eq!(Dim::Static(3).to_string(), "3");
assert_eq!(Dim::Symbolic("N".to_string()).to_string(), "N");
assert_eq!(
Dim::Bounded {
name: "K".to_string(),
min: 1,
max: 8
}
.to_string(),
"K∈[1..8]"
);
assert_eq!(
Dim::DataDependent("batch".to_string()).to_string(),
"batch?"
);
}
#[test]
fn shape_display_handles_scalar_and_n_dimensions() {
let scalar = Shape::scalar();
assert_eq!(scalar.to_string(), "scalar");
let one_d = Shape::from(vec![4usize]);
assert_eq!(one_d.to_string(), "[4]");
let two_d = Shape::from(vec![2usize, 3]);
assert_eq!(two_d.to_string(), "[2, 3]");
let mixed = Shape::new(vec![
Dim::Symbolic("M".to_string()),
Dim::Bounded {
name: "K".to_string(),
min: 1,
max: 8,
},
Dim::Static(7),
]);
assert_eq!(mixed.to_string(), "[M, K∈[1..8], 7]");
}
#[test]
fn tensor_display_handles_scalar_1d_and_high_rank() {
let scalar_int = Tensor::dense_cpu(
tokitai_operator::domain::DomainId::new("integer"),
Shape::scalar(),
vec![42_i64],
);
assert_eq!(scalar_int.to_string(), "42");
let vec_int = Tensor::dense_cpu(
tokitai_operator::domain::DomainId::new("integer"),
Shape::from(vec![3usize]),
vec![1_i64, 2, 3],
);
assert_eq!(vec_int.to_string(), "[1, 2, 3]");
let mat_int = Tensor::dense_cpu(
tokitai_operator::domain::DomainId::new("integer"),
Shape::from(vec![2usize, 2]),
vec![1_i64, 2, 3, 4],
);
let mat_str = mat_int.to_string();
assert!(mat_str.contains("Tensor<i64>"), "{mat_str}");
assert!(mat_str.contains("shape=[2, 2]"), "{mat_str}");
assert!(mat_str.contains("len=4"), "{mat_str}");
}
#[test]
fn tensor_display_works_for_padic_values() {
let q5 = PadicDomain::new(5, 3).expect("5 must be a valid prime");
let p1 = q5.element(7);
let p2 = q5.element(42);
let padic_vec = Tensor::dense_cpu(
tokitai_operator::domain::DomainId::new("Q_5[3]"),
Shape::from(vec![2usize]),
vec![p1, p2],
);
let rendered = padic_vec.to_string();
assert!(rendered.starts_with("["), "{rendered}");
assert!(rendered.ends_with("]"), "{rendered}");
assert!(rendered.contains("7"), "{rendered}");
assert!(rendered.contains("42"), "{rendered}");
}
#[test]
fn display_impls_do_not_break_existing_equality() {
let s1 = Shape::from(vec![2usize, 2]);
let s2 = Shape::from(vec![2usize, 2]);
assert_eq!(s1, s2);
assert_eq!(s1.to_string(), s2.to_string());
let t1 = Tensor::dense_cpu(
tokitai_operator::domain::DomainId::new("integer"),
Shape::from(vec![3usize]),
vec![10_i64, 20, 30],
);
let t2 = Tensor::dense_cpu(
tokitai_operator::domain::DomainId::new("integer"),
Shape::from(vec![3usize]),
vec![10_i64, 20, 30],
);
assert_eq!(t1, t2);
assert_eq!(t1.to_string(), t2.to_string());
}