sonic-core 0.1.2

Fast, lightweight and schema-less search backend.
Documentation
// Sonic
//
// Fast, lightweight and schema-less search backend
// Copyright: 2026, Rémi Bardon <remi@remibardon.name>
// License: Mozilla Public License v2.0 (MPL v2.0)

//! Non-regression tests.
//!
//! Ensures fixed bugs don’t come back.
//!
//! Tests are sorted by issue number, for easier navigation.

mod common;

use crate::common::*;

/// See <https://github.com/valeriansaliou/sonic/issues/166>.
#[test]
fn issue_166() {
    #[rustfmt::skip]
    test_ingest_then_query!(push: "Search Index", query: [
        ("search", true),
        ("earch", true),
    ]);
}

/// See <https://github.com/valeriansaliou/sonic/issues/173>.
#[test]
fn issue_173() {
    #[rustfmt::skip]
    test_ingest_then_query!(push: "Alexander Tipugin", query: [
        ("alexander", true),
        ("alex", true),
        ("lexander", true),
        ("exander", true), // Bug used to return `false`.
        ("exander Tipugin", true), // Bug used to return `false`.
    ]);
}

/// See <https://github.com/valeriansaliou/sonic/issues/245>.
#[test]
fn issue_245() {
    #[rustfmt::skip]
    test_ingest_then_query!(push: "Veronika Šibanová Veronika Sibanova", query: [
        ("Ve", true), // Bug used to return `false`.
        ("Ver", true), // Bug used to return `false`.
        ("Vero", true),
        ("Veron", true),
        ("Veroni", true),
        ("Veronik", true),
        ("Veronika", true),
        ("Veronika S", true),
        ("Veronika Si", true),
        ("Veronika Sib", true),
        ("Veronika Siba", true),
        ("Veronika Siban", true),
        ("Veronika Sibano", true),
        ("Veronika Sibanov", true),
        ("Veronika Sibanova", true),
        ("S", true), // Bug used to return `false`.
        ("Si", true), // Bug used to return `false`.
        ("Sib", true),
        ("Siba", true),
        ("Siban", true),
        ("Sibano", true),
        ("Sibanov", true),
        ("Sibanova", true),
        ("Sibanova V", true),
        ("Sibanova Ve", true), // Bug used to return `false`.
        ("Sibanova Ver", true), // Bug used to return `false`.
        ("Sibanova Vero", true),
        ("Sibanova Veron", true),
        ("Sibanova Veroni", true),
        ("Sibanova Veronik", true),
        ("Sibanova Veronika", true),
    ]);
}

/// See <https://github.com/valeriansaliou/sonic/issues/262>.
#[test]
fn issue_262() {
    #[rustfmt::skip]
    let test_cases = [
        ("I met darren", true),
        ("darren yesterday", true),
    ];

    // Sanity check: explicit locales at ingestion and query work as expected.
    test_ingest_then_query!(
        push: "I met darren yesterday. Great fun!" LANG("eng"),
        query: test_cases LANG("eng"),
    );

    // This is what the user reported (used to not work).
    test_ingest_then_query!(
        push: "I met darren yesterday. Great fun!",
        query: test_cases,
    );

    // I should also work this way.
    // It’s common to know the language when ingesting, but not at query time.
    test_ingest_then_query!(
        push: "I met darren yesterday. Great fun!" LANG("eng"),
        query: test_cases,
    );
}