/* Test of u8_check() function. Copyright (C) 2010-2024 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Written by Bruno Haible , 2010. */ #include #include "unistr.h" #include "macros.h" int main () { /* Test empty string. */ { static const uint8_t input[] = ""; ASSERT (u8_check (input, 0) == NULL); } /* Test valid non-empty string. */ { static const uint8_t input[] = /* "Данило Шеган" */ "\320\224\320\260\320\275\320\270\320\273\320\276 \320\250\320\265\320\263\320\260\320\275"; ASSERT (u8_check (input, sizeof (input) - 1) == NULL); } /* Test out-of-range character with 4 bytes: U+110000. */ { static const uint8_t input[] = "\320\224\320\260\364\220\200\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } /* Test out-of-range character with 5 bytes: U+200000. */ { static const uint8_t input[] = "\320\224\320\260\370\210\200\200\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } /* Test out-of-range character with 6 bytes: U+4000000. */ { static const uint8_t input[] = "\320\224\320\260\374\204\200\200\200\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } /* Test invalid lead byte. */ { static const uint8_t input[] = "\320\224\320\260\376\200\200\200\200\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } { static const uint8_t input[] = "\320\224\320\260\377\200\200\200\200\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } /* Test overlong 2-byte character. */ { static const uint8_t input[] = "\320\224\320\260\301\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } /* Test overlong 3-byte character. */ { static const uint8_t input[] = "\320\224\320\260\340\200\277"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } /* Test overlong 4-byte character. */ { static const uint8_t input[] = "\320\224\320\260\360\200\277\277"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } /* Test invalid bytes in 2-byte character. */ { static const uint8_t input[] = "\320\224\320\260\302\200"; ASSERT (u8_check (input, sizeof (input) - 1) == NULL); } { static const uint8_t input[] = "\320\224\320\260\302\100"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } { static const uint8_t input[] = "\320\224\320\260\302\300"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } /* Test invalid bytes in 3-byte character. */ { static const uint8_t input[] = "\320\224\320\260\342\200\200"; ASSERT (u8_check (input, sizeof (input) - 1) == NULL); } { static const uint8_t input[] = "\320\224\320\260\342\100\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } { static const uint8_t input[] = "\320\224\320\260\342\300\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } { static const uint8_t input[] = "\320\224\320\260\342\200\100"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } { static const uint8_t input[] = "\320\224\320\260\342\200\300"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } /* Test invalid bytes in 4-byte character. */ { static const uint8_t input[] = "\320\224\320\260\362\200\200\200"; ASSERT (u8_check (input, sizeof (input) - 1) == NULL); } { static const uint8_t input[] = "\320\224\320\260\362\100\200\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } { static const uint8_t input[] = "\320\224\320\260\362\300\200\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } { static const uint8_t input[] = "\320\224\320\260\362\200\100\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } { static const uint8_t input[] = "\320\224\320\260\362\200\300\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } { static const uint8_t input[] = "\320\224\320\260\362\200\200\100"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } { static const uint8_t input[] = "\320\224\320\260\362\200\200\300"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } /* Test truncated/incomplete 2-byte character. */ { static const uint8_t input[] = "\320\224\320\260\302"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } /* Test truncated/incomplete 3-byte character. */ { static const uint8_t input[] = "\320\224\320\260\342\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } /* Test truncated/incomplete 4-byte character. */ { static const uint8_t input[] = "\320\224\320\260\362\200\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } /* Test missing lead byte. */ { static const uint8_t input[] = "\320\224\320\260\200\200\200\200\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } /* Test surrogate codepoints. */ { static const uint8_t input[] = "\320\224\320\260\355\240\200\355\260\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } { static const uint8_t input[] = "\320\224\320\260\355\260\200"; ASSERT (u8_check (input, sizeof (input) - 1) == input + 4); } return test_exit_status; }