Documentation
/*
==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--

sub-strs

Copyright (C) 2019-2024  Anonymous

There are several releases over multiple years,
they are listed as ranges, such as: "2019-2024".

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.

::--::--::--::--::--::--::--::--::--::--::--::--::--::--::--::--
*/

use {
    std::{
        borrow::Cow,
        collections::HashSet,
    },
    sub_strs::CainStr,
};

#[test]
fn test_cain_str() {
    const FISRT: &str = "FiRsT";
    const SECOND: &str = "sEcOnD";
    const THIRD: &str = "THIRD";
    const FAKE: &str = "third";
    const STRS: &[&str] = &[FISRT, SECOND, THIRD, FAKE];

    let mut set: HashSet<CainStr> = HashSet::new();
    for s in STRS {
        let cain_str = CainStr::from(*s);
        assert_eq!(cain_str, CainStr::from(s.to_uppercase()));
        assert_eq!(cain_str, CainStr::from(s.to_lowercase()));
        set.insert(cain_str);
    }

    let mut vec: Vec<_> = set.into_iter().collect();
    vec.sort();
    let mut iter = vec.into_iter();
    assert_eq!(Cow::from(iter.next().unwrap()), FISRT);
    assert_eq!(Cow::from(iter.next().unwrap()), SECOND);
    assert!([THIRD, FAKE].contains(&&*Cow::from(iter.next().unwrap())));
    assert!(iter.next().is_none());
}