use std::fs;

use criterion::{criterion_group, criterion_main, Criterion};

use u_norm::nfd;
use unic_normal::StrNormalForm;
use unicode_normalization::UnicodeNormalization;

const ASCII: &str = "all types of normalized";

fn criterion_benchmark(c: &mut Criterion) {
    let mut group = c.benchmark_group("ASCII");

    group.bench_function("u-norm", |b| b.iter(|| nfd(ASCII).count()));
    group.bench_function("unicode-normalization", |b| {
        b.iter(|| UnicodeNormalization::nfd(ASCII).count())
    });
    group.bench_function("unic-normal", |b| {
        b.iter(|| StrNormalForm::nfd(ASCII).count())
    });

    group.finish();

    let long = fs::read_to_string("benches/long.txt").unwrap();

    let mut group = c.benchmark_group("Long");

    group.bench_function("u-norm", |b| b.iter(|| nfd(&long).count()));
    group.bench_function("unicode-normalization", |b| {
        b.iter(|| UnicodeNormalization::nfd(long.as_str()).count())
    });
    group.bench_function("unic-normal", |b| {
        b.iter(|| StrNormalForm::nfd(long.as_str()).count())
    });

    group.finish();
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);
