boa_engine 0.21.1

Boa is a Javascript lexer, parser and compiler written in Rust. Currently, it has support for some of the language.
Documentation
use crate::vm::source_info::find_entry;

use super::Entry;

#[test]
fn find_empty() {
    let entries = &[];

    assert_eq!(find_entry(entries, 0), None);
}

#[test]
fn find_unit_ranges() {
    let entries = &[
        Entry {
            pc: 0,
            position: Some((1, 1).into()),
        },
        Entry {
            pc: 1,
            position: Some((2, 1).into()),
        },
        Entry {
            pc: 2,
            position: Some((3, 1).into()),
        },
        Entry {
            pc: 3,
            position: Some((4, 1).into()),
        },
    ];

    assert_eq!(find_entry(entries, 0), Some((1, 1).into()));
    assert_eq!(find_entry(entries, 1), Some((2, 1).into()));
    assert_eq!(find_entry(entries, 2), Some((3, 1).into()));
    assert_eq!(find_entry(entries, 3), Some((4, 1).into()));

    assert_eq!(find_entry(entries, 4), Some((4, 1).into()));
    assert_eq!(find_entry(entries, u32::MAX), Some((4, 1).into()));
}

#[test]
fn find_before_first_entry() {
    let entries = &[Entry {
        pc: 10,
        position: Some((1, 1).into()),
    }];

    assert_eq!(find_entry(entries, 0), None);
    assert_eq!(find_entry(entries, 5), None);
    assert_eq!(find_entry(entries, 10), Some((1, 1).into()));
}

#[test]
fn find_past_last_entry() {
    let entries = &[Entry {
        pc: 0,
        position: Some((1, 1).into()),
    }];

    assert_eq!(find_entry(entries, 0), Some((1, 1).into()));
    assert_eq!(find_entry(entries, 10), Some((1, 1).into()));
    assert_eq!(find_entry(entries, u32::MAX), Some((1, 1).into()));
}

#[test]
fn find_wide_spaced_ranges_odd() {
    let entries = &[
        Entry {
            pc: 0,
            position: Some((1, 1).into()),
        },
        Entry {
            pc: 10,
            position: Some((2, 1).into()),
        },
        Entry {
            pc: 20,
            position: Some((3, 1).into()),
        },
        Entry {
            pc: 30,
            position: Some((4, 1).into()),
        },
    ];

    assert_eq!(find_entry(entries, 0), Some((1, 1).into()));
    assert_eq!(find_entry(entries, 5), Some((1, 1).into()));
    assert_eq!(find_entry(entries, 9), Some((1, 1).into()));

    assert_eq!(find_entry(entries, 10), Some((2, 1).into()));
    assert_eq!(find_entry(entries, 15), Some((2, 1).into()));
    assert_eq!(find_entry(entries, 19), Some((2, 1).into()));

    assert_eq!(find_entry(entries, 20), Some((3, 1).into()));
    assert_eq!(find_entry(entries, 25), Some((3, 1).into()));
    assert_eq!(find_entry(entries, 29), Some((3, 1).into()));

    assert_eq!(find_entry(entries, 30), Some((4, 1).into()));
    assert_eq!(find_entry(entries, 35), Some((4, 1).into()));
    assert_eq!(find_entry(entries, 39), Some((4, 1).into()));
}

#[test]
fn find_wide_spaced_ranges_even() {
    let entries = &[
        Entry {
            pc: 0,
            position: Some((1, 1).into()),
        },
        Entry {
            pc: 10,
            position: Some((2, 1).into()),
        },
        Entry {
            pc: 20,
            position: Some((3, 1).into()),
        },
        Entry {
            pc: 30,
            position: Some((4, 1).into()),
        },
        Entry {
            pc: 40,
            position: Some((5, 1).into()),
        },
    ];

    assert_eq!(find_entry(entries, 0), Some((1, 1).into()));
    assert_eq!(find_entry(entries, 5), Some((1, 1).into()));
    assert_eq!(find_entry(entries, 9), Some((1, 1).into()));

    assert_eq!(find_entry(entries, 10), Some((2, 1).into()));
    assert_eq!(find_entry(entries, 15), Some((2, 1).into()));
    assert_eq!(find_entry(entries, 19), Some((2, 1).into()));

    assert_eq!(find_entry(entries, 20), Some((3, 1).into()));
    assert_eq!(find_entry(entries, 25), Some((3, 1).into()));
    assert_eq!(find_entry(entries, 29), Some((3, 1).into()));

    assert_eq!(find_entry(entries, 30), Some((4, 1).into()));
    assert_eq!(find_entry(entries, 35), Some((4, 1).into()));
    assert_eq!(find_entry(entries, 39), Some((4, 1).into()));

    assert_eq!(find_entry(entries, 40), Some((5, 1).into()));
    assert_eq!(find_entry(entries, 45), Some((5, 1).into()));
    assert_eq!(find_entry(entries, 49), Some((5, 1).into()));
}

#[test]
fn find_with_single_entry() {
    let entries = &[
        Entry {
            pc: 22,
            position: Some((1, 1).into()),
        },
        Entry {
            pc: 33,
            position: None,
        },
    ];

    assert_eq!(find_entry(entries, 0), None);
    assert_eq!(find_entry(entries, 10), None);
    assert_eq!(find_entry(entries, 21), None);

    assert_eq!(find_entry(entries, 22), Some((1, 1).into()));
    assert_eq!(find_entry(entries, 30), Some((1, 1).into()));
    assert_eq!(find_entry(entries, 32), Some((1, 1).into()));

    assert_eq!(find_entry(entries, 33), None);
    assert_eq!(find_entry(entries, u32::MAX), None);
}