temex 0.10.0

Regex-like temporal expressions for evaluating systems that change over time
Documentation
use polars::df;
use polars::prelude::*;
use std::fs::File;
use temex::{Temex, TemexTrace};

#[test]
fn test_misc() {
    let trace =
        TemexTrace::try_from(&File::open("tests/traces/one_var_length_1.csv").unwrap()).unwrap();

    let te = Temex::new("[p]").unwrap();
    assert!(te.is_match(&trace).unwrap());

    let te_b = Temex::new("[not p]").unwrap();
    assert!(!te_b.is_match(&trace).unwrap());
}

#[test]
fn test_bad_trace() {
    let bad_trace_file = File::open("tests/traces/bad_trace.csv").unwrap();

    let bad_trace = TemexTrace::try_from(&bad_trace_file);
    assert!(bad_trace.is_err());
}

#[test]
fn test_fizzbuzz() {
    let fizzbuzz_trace =
        TemexTrace::try_from(File::open("tests/traces/fizzbuzz.csv").unwrap()).unwrap();

    let te2 = Temex::new("([true][true][Fizz or (Buzz and false)]){33}").unwrap();
    assert!(te2.is_match(&fizzbuzz_trace).unwrap());

    let te3 = Temex::new("([true]{4}[Buzz or (Fizz and false)]){20}").unwrap();
    assert!(te3.is_match(&fizzbuzz_trace).unwrap());

    let te4 = Temex::new("([true]{14}[Fizz and Buzz]){6}").unwrap();
    assert!(te4.is_match(&fizzbuzz_trace).unwrap());

    let te5 = Temex::new("[Buzz and Fizz]").unwrap();
    let te5_matches: Vec<(usize, usize)> = te5
        .find_iter(&fizzbuzz_trace)
        .map(|m| (m.start(), m.end()))
        .collect();
    println!("{:?}", te5_matches);
    assert_eq!(
        te5_matches,
        vec![(14, 15), (29, 30), (44, 45), (59, 60), (74, 75), (89, 90)]
    );
}

#[test]
fn test_polars() {
    let df = df! [
        "p1" => [true, true, true],
        "p2" => [false, false, false],
        "p3" => [true, false, true]
    ]
    .unwrap();

    let trace = TemexTrace::try_from(df).unwrap();

    let te = Temex::new("^[p1 and (p2 or p3)][p1][p1 and (p2 or p3)]$").unwrap();
    assert!(te.is_match(&trace).unwrap());
}

#[test]
fn test_string() {
    let s = "p1,p2,p3,p4,p5\n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n\
             0, 0, 0, 0, 0 \n\
             1, 1, 1, 1, 1 \n";
    let trace = &s.parse::<TemexTrace>().unwrap();
    let trace_ = TemexTrace::try_from(s).unwrap();
    assert_eq!(*trace, trace_);

    let te = Temex::new(
        "^([not (p1 or p2 or p3 or p5) and not not not p4][(p1 or p3) and not not not not not not p4]){21}$",
    )
    .unwrap();

    assert!(te.is_match(&trace).unwrap());

    let s = "CPU_core1_GT_80, CPU_core2_GT_80, mem_usage_GT_40\n\
                        0,               0,               0\n\
                        1,               0,               0\n\
                        0,               1,               0\n\
                        0,               0,               1\n\
                        1,               0,               1\n\
                        0,               1,               1\n\
                        1,               1,               0\n\
                        1,               1,               0\n\
                        1,               1,               0\n";

    let trace2 = &s.parse::<TemexTrace>().unwrap();
    let te = Temex::new("[CPU_core1_GT_80 and CPU_core2_GT_80 and not mem_usage_GT_40]*").unwrap();

    assert!(te.is_match(trace2).unwrap());
}