Programming Language

Nocter

A self-contained systems language built around simplicity, encapsulation, and foolproof design.

/development/std/str/transformation_tests.nct

transformation_tests.nct

//! Borrowed trim and owned text transformation contract tests.

see ./index.nct

test ascii_trim_preserves_utf8_and_named_edges {
    let text: &str = " \t こんにちは \r\n"
    if text.trim_ascii_start() != "こんにちは \r\n" {
        return error.new("std.str.test", "start trim changed the wrong edge")
    }
    if text.trim_ascii_end() != " \t こんにちは" {
        return error.new("std.str.test", "end trim changed the wrong edge")
    }
    if text.trim_ascii() != "こんにちは" {
        return error.new("std.str.test", "two-sided trim changed UTF-8 text")
    }
    let whitespace: &str = "\t \r\n"
    if whitespace.trim_ascii_start().len() != 0
        || whitespace.trim_ascii_end().len() != 0
        || whitespace.trim_ascii().len() != 0 {
        return error.new("std.str.test", "all-whitespace trim was not empty")
    }
    return
}

test repeat_and_replace_have_exact_owned_spelling {
    let repeated = "ab".repeat(3)
    if (&repeated as &str) != "ababab" {
        return error.new("std.str.test", "repeat spelling changed")
    }
    let empty = "ab".repeat(0)
    if (&empty as &str) != "" {
        return error.new("std.str.test", "zero repeat was not empty")
    }

    let grown = "a-b-a".replace_all("a", "xyz")?
    if (&grown as &str) != "xyz-b-xyz" {
        return error.new("std.str.test", "growing replacement changed spelling")
    }
    let shrunk = "aaaa".replace_all("aa", "b")?
    if (&shrunk as &str) != "bb" {
        return error.new("std.str.test", "replacement was not non-overlapping")
    }
    let recursive = "a".replace_all("a", "aa")?
    if (&recursive as &str) != "aa" {
        return error.new("std.str.test", "replacement text was searched recursively")
    }
    let unchanged = "éclair".replace_all("z", "x")?
    if (&unchanged as &str) != "éclair" {
        return error.new("std.str.test", "missing pattern changed the source text")
    }
    return
}

test replace_rejects_an_empty_pattern {
    let _result = "text".replace_all("", "x") catch failure {
        if failure.has_code("std.str.empty_pattern") { return }
        return error.new("std.str.test", "empty pattern returned the wrong error")
    }
    return error.new("std.str.test", "empty replacement pattern was accepted")
}