arrow2 0.18.0

Unofficial implementation of Apache Arrow spec in safe Rust
Documentation
use arrow2::array::*;
use arrow2::compute::arithmetics::basic::*;
use arrow2::compute::arithmetics::{ArrayCheckedRem, ArrayRem};

#[test]
#[should_panic]
fn test_rem_mismatched_length() {
    let a = Int32Array::from_slice([5, 6]);
    let b = Int32Array::from_slice([5]);
    rem(&a, &b);
}

#[test]
fn test_rem() {
    let a = Int32Array::from(&[Some(5), Some(6)]);
    let b = Int32Array::from(&[Some(4), Some(4)]);
    let result = rem(&a, &b);
    let expected = Int32Array::from(&[Some(1), Some(2)]);
    assert_eq!(result, expected);

    // Trait testing
    let result = a.rem(&b);
    assert_eq!(result, expected);
}

#[test]
#[should_panic]
fn test_rem_panic() {
    let a = Int8Array::from(&[Some(10i8)]);
    let b = Int8Array::from(&[Some(0i8)]);
    let _ = rem(&a, &b);
}

#[test]
fn test_rem_checked() {
    let a = Int32Array::from(&[Some(5), None, Some(3), Some(6)]);
    let b = Int32Array::from(&[Some(5), Some(3), None, Some(5)]);
    let result = checked_rem(&a, &b);
    let expected = Int32Array::from(&[Some(0), None, None, Some(1)]);
    assert_eq!(result, expected);

    let a = Int32Array::from(&[Some(5), None, Some(3), Some(6)]);
    let b = Int32Array::from(&[Some(5), Some(0), Some(0), Some(5)]);
    let result = checked_rem(&a, &b);
    let expected = Int32Array::from(&[Some(0), None, None, Some(1)]);
    assert_eq!(result, expected);

    // Trait testing
    let result = a.checked_rem(&b);
    assert_eq!(result, expected);
}

#[test]
fn test_rem_scalar() {
    let a = Int32Array::from(&[None, Some(6), None, Some(5)]);
    let result = rem_scalar(&a, &2i32);
    let expected = Int32Array::from(&[None, Some(0), None, Some(1)]);
    assert_eq!(result, expected);

    // Trait testing
    let result = a.rem(&2i32);
    assert_eq!(result, expected);

    // check the strength reduced branches
    let a = UInt64Array::from(&[None, Some(6), None, Some(5)]);
    let result = rem_scalar(&a, &2u64);
    let expected = UInt64Array::from(&[None, Some(0), None, Some(1)]);
    assert_eq!(result, expected);

    let a = UInt32Array::from(&[None, Some(6), None, Some(5)]);
    let result = rem_scalar(&a, &2u32);
    let expected = UInt32Array::from(&[None, Some(0), None, Some(1)]);
    assert_eq!(result, expected);

    let a = UInt16Array::from(&[None, Some(6), None, Some(5)]);
    let result = rem_scalar(&a, &2u16);
    let expected = UInt16Array::from(&[None, Some(0), None, Some(1)]);
    assert_eq!(result, expected);

    let a = UInt8Array::from(&[None, Some(6), None, Some(5)]);
    let result = rem_scalar(&a, &2u8);
    let expected = UInt8Array::from(&[None, Some(0), None, Some(1)]);
    assert_eq!(result, expected);
}

#[test]
fn test_rem_scalar_checked() {
    let a = Int32Array::from(&[None, Some(6), None, Some(7)]);
    let result = checked_rem_scalar(&a, &2i32);
    let expected = Int32Array::from(&[None, Some(0), None, Some(1)]);
    assert_eq!(result, expected);

    let a = Int32Array::from(&[None, Some(6), None, Some(6)]);
    let result = checked_rem_scalar(&a, &0);
    let expected = Int32Array::from(&[None, None, None, None]);
    assert_eq!(result, expected);

    // Trait testing
    let result = a.checked_rem(&0);
    assert_eq!(result, expected);
}