From 334ed804f2ead7f8f99ad87a9abe113c4f2c2706 Mon Sep 17 00:00:00 2001 From: Akuli Date: Sun, 3 Dec 2023 18:36:13 +0200 Subject: [PATCH] add tests for stdlib/ascii.jou (#407) --- self_hosted/runs_wrong.txt | 1 + src/print.c | 2 +- stdlib/ascii.jou | 8 ++----- tests/should_succeed/ascii_test.jou | 35 +++++++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 tests/should_succeed/ascii_test.jou diff --git a/self_hosted/runs_wrong.txt b/self_hosted/runs_wrong.txt index b44b692f..e64ada59 100644 --- a/self_hosted/runs_wrong.txt +++ b/self_hosted/runs_wrong.txt @@ -43,3 +43,4 @@ tests/wrong_type/assert.jou tests/wrong_type/cannot_be_indexed.jou tests/wrong_type/index.jou stdlib/ascii.jou +tests/should_succeed/ascii_test.jou diff --git a/src/print.c b/src/print.c index fab4d3a5..60f495ec 100644 --- a/src/print.c +++ b/src/print.c @@ -19,7 +19,7 @@ static void print_string(const char *s, int len) else if (s[i] == '\n') printf("\\n"); else - printf("\\x%02x", s[i]); // TODO: \x is not yet recognized by the tokenizer + printf("\\x%02x", (unsigned char)s[i]); // TODO: \x is not yet recognized by the tokenizer } putchar('"'); } diff --git a/stdlib/ascii.jou b/stdlib/ascii.jou index 5dedfca1..07b44493 100644 --- a/stdlib/ascii.jou +++ b/stdlib/ascii.jou @@ -2,7 +2,6 @@ import "stdlib/str.jou" import "stdlib/mem.jou" # Test if a string is ASCII only. -# TODO: test def is_ascii(s: byte*) -> bool: for p = s; *p != '\0'; p++: if *p >= 128: @@ -10,19 +9,16 @@ def is_ascii(s: byte*) -> bool: return True # Check for '0', '1', ..., '9'. -# TODO: test def is_ascii_digit(b: byte) -> bool: return '0' <= b and b <= '9' # Checks if the given byte is an ASCII punctuation character, such as '*' or '_' or '"'. -# TODO: test def is_ascii_punctuation(b: byte) -> bool: - return strchr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", b) != NULL + return b != '\0' and strchr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", b) != NULL # Checks if the given byte is an ASCII whitespace character, such as ' ' or '\n'. -# TODO: test def is_ascii_whitespace(b: byte) -> bool: - return strchr("\t\n\x0b\x0c\r\x1c\x1d\x1e\x1f ", b) != NULL + return b != '\0' and strchr("\t\n\x0b\x0c\r\x1c\x1d\x1e\x1f ", b) != NULL # Removes ASCII whitespace from both ends of a string in-place. # Similar to .strip() in Python or .trim() in JavaScript. diff --git a/tests/should_succeed/ascii_test.jou b/tests/should_succeed/ascii_test.jou new file mode 100644 index 00000000..a6c4f84c --- /dev/null +++ b/tests/should_succeed/ascii_test.jou @@ -0,0 +1,35 @@ +import "stdlib/ascii.jou" +import "stdlib/str.jou" + +def main() -> int: + assert is_ascii("hello") + assert is_ascii("hello world test!!! @$!") + assert is_ascii("") + assert not is_ascii("örkkimörkki") + + assert is_ascii_digit('0') + assert is_ascii_digit('7') + assert is_ascii_digit('9') + assert not is_ascii_digit('x') + assert not is_ascii_digit('\0') + + assert is_ascii_punctuation('!') + assert is_ascii_punctuation('_') + assert not is_ascii_punctuation('a') + assert not is_ascii_punctuation('2') + assert not is_ascii_punctuation('\0') + + assert is_ascii_whitespace(' ') + assert is_ascii_whitespace('\t') + assert is_ascii_whitespace('\r') + assert is_ascii_whitespace('\n') + assert not is_ascii_whitespace('a') + assert not is_ascii_whitespace('.') + assert not is_ascii_whitespace('\0') + + s: byte[100] + strcpy(s, " hello world \r\n \t ") + trim_ascii_whitespace(s) + assert strcmp(s, "hello world") == 0 + + return 0