use vortex_array::ArrayRef;
use vortex_array::Canonical;
use vortex_array::IntoArray;
use vortex_array::VortexSessionExecute;
use vortex_array::arrays::PrimitiveArray;
use vortex_array::assert_arrays_eq;
use vortex_array::validity::Validity;
use vortex_buffer::buffer;
use vortex_error::VortexResult;
use crate::arrays::shared::Shared;
use crate::arrays::shared::SharedArrayExt;
#[test]
fn shared_array_caches_on_canonicalize() -> VortexResult<()> {
let array = PrimitiveArray::new(buffer![1i32, 2, 3], Validity::NonNullable).into_array();
let shared = Shared::new(array);
let session = vortex_array::array_session();
let mut ctx = session.create_execution_ctx();
let first = shared.get_or_compute(|source| source.clone().execute::<Canonical>(&mut ctx))?;
let second = shared.get_or_compute(|_| panic!("should not execute twice"))?;
assert!(ArrayRef::ptr_eq(&first, &second));
assert_arrays_eq!(first, PrimitiveArray::from_iter([1i32, 2, 3]), &mut ctx);
Ok(())
}