]> Kevux Git Server - fll/commitdiff
Update: Add some unit tests for f_utf.
authorKevin Day <thekevinday@gmail.com>
Tue, 14 Jun 2022 00:02:51 +0000 (19:02 -0500)
committerKevin Day <thekevinday@gmail.com>
Tue, 14 Jun 2022 00:02:51 +0000 (19:02 -0500)
Add the structure for the remaining tests.
The (currently) unused tests are just copy and pastes and may need changes.

With the exception of the "valid" tests, these unit tests use statically generated data files containing bytesequences (unsigned 32-bit) in base-10 format.
The base-10 format representation of the bytesequence is used for easy reading using standard libc functions.

These static data files are generated using a combination of the Unicode database codepoints, a script I wrote, and the "unicode" program.
The Unicode codepoints used for each generated bytesequence set are also provided.

This implements the following tests:
- control
- digit
- emoji
- symbol
- valid

The intent of this is to test the entire spectrum of valid codepoints (except for the "valid" tests which tests every single possible value).
Due to every single value being tested by "valid" tests for both f_utf_is_valid() and f_utf_character_is_valid() results in a long running test.

75 files changed:
level_0/f_utf/data/build/settings-tests
level_0/f_utf/data/tests/bytesequences/control-all.txt [new file with mode: 0644]
level_0/f_utf/data/tests/bytesequences/digit-all.txt [new file with mode: 0644]
level_0/f_utf/data/tests/bytesequences/emoji-all.txt [new file with mode: 0644]
level_0/f_utf/data/tests/bytesequences/symbol-all.txt [moved from level_0/f_utf/data/tests/bytesequences/symbols-all.txt with 100% similarity]
level_0/f_utf/data/tests/codepoints/control-all.txt [new file with mode: 0644]
level_0/f_utf/data/tests/codepoints/digit-all.txt [new file with mode: 0644]
level_0/f_utf/data/tests/codepoints/emoji-all.txt [new file with mode: 0644]
level_0/f_utf/data/tests/codepoints/symbol-all.txt [moved from level_0/f_utf/data/tests/codepoints/symbols-all.txt with 100% similarity]
level_0/f_utf/tests/unit/c/data-utf.c
level_0/f_utf/tests/unit/c/data-utf.h
level_0/f_utf/tests/unit/c/test-utf-character_is_alphabetic.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_alphabetic.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_combining.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_combining.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_control.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_control.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_digit.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_digit.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_emoji.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_emoji.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_numeric.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_numeric.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_phonetic.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_phonetic.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_subscript.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_subscript.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_superscript.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_superscript.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_surrogate.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_surrogate.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_symbol.c
level_0/f_utf/tests/unit/c/test-utf-character_is_valid.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_valid.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_whitespace.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_whitespace.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_wide.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_wide.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_word.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_word.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_zero_width.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-character_is_zero_width.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_alphabetic.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_alphabetic.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_combining.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_combining.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_control.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_control.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_digit.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_digit.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_emoji.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_emoji.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_numeric.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_numeric.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_phonetic.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_phonetic.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_subscript.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_subscript.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_superscript.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_superscript.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_surrogate.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_surrogate.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_symbol.c
level_0/f_utf/tests/unit/c/test-utf-is_valid.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_valid.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_whitespace.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_whitespace.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_wide.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_wide.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_word.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_word.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_zero_width.c [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf-is_zero_width.h [new file with mode: 0644]
level_0/f_utf/tests/unit/c/test-utf.c
level_0/f_utf/tests/unit/c/test-utf.h

index 196e3cbb78bf1a0f5fd5076e6b69a5171000703f..c4da7c7d5868b6ed8c2b2041ddf14bb6e0fe1948 100644 (file)
@@ -26,9 +26,23 @@ build_libraries -lc -lcmocka
 build_libraries-individual -lf_memory -lf_string -lf_utf
 
 build_sources_program test-utf-append.c test-utf-append_assure.c test-utf-append_assure_nulless.c test-utf-append_nulless.c
+build_sources_program test-utf-character_is_alphabetic.c test-utf-is_alphabetic.c
+build_sources_program test-utf-character_is_combining.c test-utf-is_combining.c
+build_sources_program test-utf-character_is_control.c test-utf-is_control.c
+build_sources_program test-utf-character_is_digit.c test-utf-is_digit.c
+build_sources_program test-utf-character_is_emoji.c test-utf-is_emoji.c
+build_sources_program test-utf-character_is_numeric.c test-utf-is_numeric.c
 build_sources_program test-utf-character_is_private.c test-utf-is_private.c
 build_sources_program test-utf-character_is_punctuation.c test-utf-is_punctuation.c
+build_sources_program test-utf-character_is_subscript.c test-utf-is_subscript.c
+build_sources_program test-utf-character_is_superscript.c test-utf-is_superscript.c
+build_sources_program test-utf-character_is_surrogate.c test-utf-is_surrogate.c
 build_sources_program test-utf-character_is_symbol.c test-utf-is_symbol.c
+build_sources_program test-utf-character_is_valid.c test-utf-is_valid.c
+build_sources_program test-utf-character_is_whitespace.c test-utf-is_whitespace.c
+build_sources_program test-utf-character_is_wide.c test-utf-is_wide.c
+build_sources_program test-utf-character_is_word.c test-utf-is_word.c
+build_sources_program test-utf-character_is_zero_width.c test-utf-is_zero_width.c
 build_sources_program test-utf-dynamic_adjust.c test-utf-dynamic_append.c test-utf-dynamic_append_assure.c test-utf-dynamic_append_assure_nulless.c test-utf-dynamic_append_nulless.c
 build_sources_program test-utf-dynamic_decimate_by.c test-utf-dynamic_decrease_by.c test-utf-dynamic_increase.c test-utf-dynamic_increase_by.c
 build_sources_program test-utf-dynamic_mash.c test-utf-dynamic_mash_nulless.c
diff --git a/level_0/f_utf/data/tests/bytesequences/control-all.txt b/level_0/f_utf/data/tests/bytesequences/control-all.txt
new file mode 100644 (file)
index 0000000..4b9f4da
--- /dev/null
@@ -0,0 +1,65 @@
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+127
+49792
+49793
+49794
+49795
+49796
+49797
+49798
+49799
+49800
+49801
+49802
+49803
+49804
+49805
+49806
+49807
+49808
+49809
+49810
+49811
+49812
+49813
+49814
+49815
+49816
+49817
+49818
+49819
+49820
+49821
+49822
+49823
diff --git a/level_0/f_utf/data/tests/bytesequences/digit-all.txt b/level_0/f_utf/data/tests/bytesequences/digit-all.txt
new file mode 100644 (file)
index 0000000..9bcbc2f
--- /dev/null
@@ -0,0 +1,650 @@
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+55712
+55713
+55714
+55715
+55716
+55717
+55718
+55719
+55720
+55721
+56240
+56241
+56242
+56243
+56244
+56245
+56246
+56247
+56248
+56249
+57216
+57217
+57218
+57219
+57220
+57221
+57222
+57223
+57224
+57225
+14722470
+14722471
+14722472
+14722473
+14722474
+14722475
+14722476
+14722477
+14722478
+14722479
+14722982
+14722983
+14722984
+14722985
+14722986
+14722987
+14722988
+14722989
+14722990
+14722991
+14723494
+14723495
+14723496
+14723497
+14723498
+14723499
+14723500
+14723501
+14723502
+14723503
+14724006
+14724007
+14724008
+14724009
+14724010
+14724011
+14724012
+14724013
+14724014
+14724015
+14724518
+14724519
+14724520
+14724521
+14724522
+14724523
+14724524
+14724525
+14724526
+14724527
+14725030
+14725031
+14725032
+14725033
+14725034
+14725035
+14725036
+14725037
+14725038
+14725039
+14725542
+14725543
+14725544
+14725545
+14725546
+14725547
+14725548
+14725549
+14725550
+14725551
+14726054
+14726055
+14726056
+14726057
+14726058
+14726059
+14726060
+14726061
+14726062
+14726063
+14726566
+14726567
+14726568
+14726569
+14726570
+14726571
+14726572
+14726573
+14726574
+14726575
+14727078
+14727079
+14727080
+14727081
+14727082
+14727083
+14727084
+14727085
+14727086
+14727087
+14727568
+14727569
+14727570
+14727571
+14727572
+14727573
+14727574
+14727575
+14727576
+14727577
+14728080
+14728081
+14728082
+14728083
+14728084
+14728085
+14728086
+14728087
+14728088
+14728089
+14728352
+14728353
+14728354
+14728355
+14728356
+14728357
+14728358
+14728359
+14728360
+14728361
+14778752
+14778753
+14778754
+14778755
+14778756
+14778757
+14778758
+14778759
+14778760
+14778761
+4036006560
+4036006561
+4036006562
+4036006563
+4036006564
+4036006565
+4036006566
+4036006567
+4036006568
+4036006569
+14779024
+14779025
+14779026
+14779027
+14779028
+14779029
+14779030
+14779031
+14779032
+14779033
+4036015280
+4036015281
+4036015282
+4036015283
+4036015284
+4036015285
+4036015286
+4036015287
+4036015288
+4036015289
+4036067750
+4036067751
+4036067752
+4036067753
+4036067754
+4036067755
+4036067756
+4036067757
+4036067758
+4036067759
+4036068272
+4036068273
+4036068274
+4036068275
+4036068276
+4036068277
+4036068278
+4036068279
+4036068280
+4036068281
+4036068534
+4036068535
+4036068536
+4036068537
+4036068538
+4036068539
+4036068540
+4036068541
+4036068542
+4036068543
+4036069264
+4036069265
+4036069266
+4036069267
+4036069268
+4036069269
+4036069270
+4036069271
+4036069272
+4036069273
+4036070320
+4036070321
+4036070322
+4036070323
+4036070324
+4036070325
+4036070326
+4036070327
+4036070328
+4036070329
+4036071824
+4036071825
+4036071826
+4036071827
+4036071828
+4036071829
+4036071830
+4036071831
+4036071832
+4036071833
+4036072336
+4036072337
+4036072338
+4036072339
+4036072340
+4036072341
+4036072342
+4036072343
+4036072344
+4036072345
+4036073872
+4036073873
+4036073874
+4036073875
+4036073876
+4036073877
+4036073878
+4036073879
+4036073880
+4036073881
+4036074368
+4036074369
+4036074370
+4036074371
+4036074372
+4036074373
+4036074374
+4036074375
+4036074376
+4036074377
+4036074672
+4036074673
+4036074674
+4036074675
+4036074676
+4036074677
+4036074678
+4036074679
+4036074680
+4036074681
+4036076448
+4036076449
+4036076450
+4036076451
+4036076452
+4036076453
+4036076454
+4036076455
+4036076456
+4036076457
+4036076944
+4036076945
+4036076946
+4036076947
+4036076948
+4036076949
+4036076950
+4036076951
+4036076952
+4036076953
+4036080016
+4036080017
+4036080018
+4036080019
+4036080020
+4036080021
+4036080022
+4036080023
+4036080024
+4036080025
+4036081040
+4036081041
+4036081042
+4036081043
+4036081044
+4036081045
+4036081046
+4036081047
+4036081048
+4036081049
+4036081312
+4036081313
+4036081314
+4036081315
+4036081316
+4036081317
+4036081318
+4036081319
+4036081320
+4036081321
+4036405664
+4036405665
+4036405666
+4036405667
+4036405668
+4036405669
+4036405670
+4036405671
+4036405672
+4036405673
+4036406672
+4036406673
+4036406674
+4036406675
+4036406676
+4036406677
+4036406678
+4036406679
+4036406680
+4036406681
+14786464
+14786465
+14786466
+14786467
+14786468
+14786469
+14786470
+14786471
+14786472
+14786473
+14786704
+14786705
+14786706
+14786707
+14786708
+14786709
+14786710
+14786711
+14786712
+14786713
+14787974
+14787975
+14787976
+14787977
+14787978
+14787979
+14787980
+14787981
+14787982
+14787983
+14788496
+14788497
+14788498
+14788499
+14788500
+14788501
+14788502
+14788503
+14788504
+14788505
+14789248
+14789249
+14789250
+14789251
+14789252
+14789253
+14789254
+14789255
+14789256
+14789257
+14789264
+14789265
+14789266
+14789267
+14789268
+14789269
+14789270
+14789271
+14789272
+14789273
+14790032
+14790033
+14790034
+14790035
+14790036
+14790037
+14790038
+14790039
+14790040
+14790041
+14790320
+14790321
+14790322
+14790323
+14790324
+14790325
+14790326
+14790327
+14790328
+14790329
+14791040
+14791041
+14791042
+14791043
+14791044
+14791045
+14791046
+14791047
+14791048
+14791049
+14791056
+14791057
+14791058
+14791059
+14791060
+14791061
+14791062
+14791063
+14791064
+14791065
+4036861838
+4036861839
+4036861840
+4036861841
+4036861842
+4036861843
+4036861844
+4036861845
+4036861846
+4036861847
+4036861848
+4036861849
+4036861850
+4036861851
+4036861852
+4036861853
+4036861854
+4036861855
+4036861856
+4036861857
+4036861858
+4036861859
+4036861860
+4036861861
+4036861862
+4036861863
+4036861864
+4036861865
+4036861866
+4036861867
+4036861868
+4036861869
+4036861870
+4036861871
+4036861872
+4036861873
+4036861874
+4036861875
+4036861876
+4036861877
+4036861878
+4036861879
+4036861880
+4036861881
+4036861882
+4036861883
+4036861884
+4036861885
+4036861886
+4036861887
+4036920704
+4036920705
+4036920706
+4036920707
+4036920708
+4036920709
+4036920710
+4036920711
+4036920712
+4036920713
+4036922288
+4036922289
+4036922290
+4036922291
+4036922292
+4036922293
+4036922294
+4036922295
+4036922296
+4036922297
+4036928912
+4036928913
+4036928914
+4036928915
+4036928916
+4036928917
+4036928918
+4036928919
+4036928920
+4036928921
+4036997040
+4036997041
+4036997042
+4036997043
+4036997044
+4036997045
+4036997046
+4036997047
+4036997048
+4036997049
+15374496
+15374497
+15374498
+15374499
+15374500
+15374501
+15374502
+15374503
+15374504
+15374505
+15377296
+15377297
+15377298
+15377299
+15377300
+15377301
+15377302
+15377303
+15377304
+15377305
+15377536
+15377537
+15377538
+15377539
+15377540
+15377541
+15377542
+15377543
+15377544
+15377545
+15378320
+15378321
+15378322
+15378323
+15378324
+15378325
+15378326
+15378327
+15378328
+15378329
+15378352
+15378353
+15378354
+15378355
+15378356
+15378357
+15378358
+15378359
+15378360
+15378361
+15378832
+15378833
+15378834
+15378835
+15378836
+15378837
+15378838
+15378839
+15378840
+15378841
+15380400
+15380401
+15380402
+15380403
+15380404
+15380405
+15380406
+15380407
+15380408
+15380409
+15711376
+15711377
+15711378
+15711379
+15711380
+15711381
+15711382
+15711383
+15711384
+15711385
diff --git a/level_0/f_utf/data/tests/bytesequences/emoji-all.txt b/level_0/f_utf/data/tests/bytesequences/emoji-all.txt
new file mode 100644 (file)
index 0000000..51137ee
--- /dev/null
@@ -0,0 +1,1980 @@
+49833
+49838
+4036984964
+4036985743
+4036986288
+4036986289
+4036986302
+4036986303
+4036986510
+4036986513
+4036986514
+4036986515
+4036986516
+4036986517
+4036986518
+4036986519
+4036986520
+4036986521
+4036986522
+4036986790
+4036986791
+4036986792
+4036986793
+4036986794
+4036986795
+4036986796
+4036986797
+4036986798
+4036986799
+4036987009
+4036987010
+4036987034
+4036987055
+4036987058
+4036987059
+4036987060
+4036987061
+4036987062
+4036987063
+4036987064
+4036987065
+4036987066
+4036987280
+4036987281
+4036988032
+4036988033
+4036988034
+4036988035
+4036988036
+4036988037
+4036988038
+4036988039
+4036988040
+4036988041
+4036988042
+4036988043
+4036988044
+4036988045
+4036988046
+4036988047
+4036988048
+4036988049
+4036988050
+4036988051
+4036988052
+4036988053
+4036988054
+4036988055
+4036988056
+4036988057
+4036988058
+4036988059
+4036988060
+4036988061
+4036988062
+4036988063
+4036988064
+4036988065
+4036988066
+4036988067
+4036988068
+4036988069
+4036988070
+4036988071
+4036988072
+4036988073
+4036988074
+4036988075
+4036988076
+4036988077
+4036988078
+4036988079
+4036988080
+4036988081
+4036988082
+4036988083
+4036988084
+4036988085
+4036988086
+4036988087
+4036988088
+4036988089
+4036988090
+4036988091
+4036988092
+4036988093
+4036988094
+4036988095
+4036988288
+4036988289
+4036988290
+4036988291
+4036988292
+4036988293
+4036988294
+4036988295
+4036988296
+4036988297
+4036988298
+4036988299
+4036988300
+4036988301
+4036988302
+4036988303
+4036988304
+4036988305
+4036988306
+4036988307
+4036988308
+4036988309
+4036988310
+4036988311
+4036988312
+4036988313
+4036988314
+4036988315
+4036988316
+4036988317
+4036988318
+4036988319
+4036988320
+4036988321
+4036988322
+4036988323
+4036988324
+4036988325
+4036988326
+4036988327
+4036988328
+4036988329
+4036988330
+4036988331
+4036988332
+4036988333
+4036988334
+4036988335
+4036988336
+4036988337
+4036988338
+4036988339
+4036988340
+4036988341
+4036988342
+4036988343
+4036988344
+4036988345
+4036988346
+4036988347
+4036988348
+4036988349
+4036988350
+4036988351
+4036988544
+4036988545
+4036988546
+4036988547
+4036988548
+4036988549
+4036988550
+4036988551
+4036988552
+4036988553
+4036988554
+4036988555
+4036988556
+4036988557
+4036988558
+4036988559
+4036988560
+4036988561
+4036988562
+4036988563
+4036988564
+4036988565
+4036988566
+4036988567
+4036988568
+4036988569
+4036988570
+4036988571
+4036988572
+4036988573
+4036988574
+4036988575
+4036988576
+4036988577
+4036988578
+4036988579
+4036988580
+4036988581
+4036988582
+4036988583
+4036988584
+4036988585
+4036988586
+4036988587
+4036988588
+4036988589
+4036988590
+4036988591
+4036988592
+4036988593
+4036988594
+4036988595
+4036988596
+4036988597
+4036988598
+4036988599
+4036988600
+4036988601
+4036988602
+4036988603
+4036988604
+4036988605
+4036988606
+4036988607
+4036988800
+4036988801
+4036988802
+4036988803
+4036988804
+4036988805
+4036988806
+4036988807
+4036988808
+4036988809
+4036988810
+4036988811
+4036988812
+4036988813
+4036988814
+4036988815
+4036988816
+4036988817
+4036988818
+4036988819
+4036988820
+4036988821
+4036988822
+4036988823
+4036988824
+4036988825
+4036988826
+4036988827
+4036988828
+4036988829
+4036988830
+4036988831
+4036988832
+4036988833
+4036988834
+4036988835
+4036988836
+4036988837
+4036988838
+4036988839
+4036988840
+4036988841
+4036988842
+4036988843
+4036988844
+4036988845
+4036988846
+4036988847
+4036988848
+4036988849
+4036988850
+4036988851
+4036988852
+4036988853
+4036988854
+4036988855
+4036988856
+4036988857
+4036988858
+4036988859
+4036988860
+4036988861
+4036988862
+4036988863
+4036989056
+4036989057
+4036989058
+4036989059
+4036989060
+4036989061
+4036989062
+4036989063
+4036989064
+4036989065
+4036989066
+4036989067
+4036989068
+4036989069
+4036989070
+4036989071
+4036989072
+4036989073
+4036989074
+4036989075
+4036989076
+4036989077
+4036989078
+4036989079
+4036989080
+4036989081
+4036989082
+4036989083
+4036989084
+4036989085
+4036989086
+4036989087
+4036989088
+4036989089
+4036989090
+4036989091
+4036989092
+4036989093
+4036989094
+4036989095
+4036989096
+4036989097
+4036989098
+4036989099
+4036989100
+4036989101
+4036989102
+4036989103
+4036989104
+4036989105
+4036989106
+4036989107
+4036989108
+4036989109
+4036989110
+4036989111
+4036989112
+4036989113
+4036989114
+4036989115
+4036989116
+4036989117
+4036989118
+4036989119
+4036989312
+4036989313
+4036989314
+4036989315
+4036989316
+4036989317
+4036989318
+4036989319
+4036989320
+4036989321
+4036989322
+4036989323
+4036989324
+4036989325
+4036989326
+4036989327
+4036989328
+4036989329
+4036989330
+4036989331
+4036989332
+4036989333
+4036989334
+4036989335
+4036989336
+4036989337
+4036989338
+4036989339
+4036989340
+4036989341
+4036989342
+4036989343
+4036989344
+4036989345
+4036989346
+4036989347
+4036989348
+4036989349
+4036989350
+4036989351
+4036989352
+4036989353
+4036989354
+4036989355
+4036989356
+4036989357
+4036989358
+4036989359
+4036989360
+4036989361
+4036989362
+4036989363
+4036989364
+4036989365
+4036989366
+4036989367
+4036989368
+4036989369
+4036989370
+4036989371
+4036989372
+4036989373
+4036989374
+4036989375
+4036989568
+4036989569
+4036989570
+4036989571
+4036989572
+4036989573
+4036989574
+4036989575
+4036989576
+4036989577
+4036989578
+4036989579
+4036989580
+4036989581
+4036989582
+4036989583
+4036989584
+4036989585
+4036989586
+4036989587
+4036989588
+4036989589
+4036989590
+4036989591
+4036989592
+4036989593
+4036989594
+4036989595
+4036989596
+4036989597
+4036989598
+4036989599
+4036989600
+4036989601
+4036989602
+4036989603
+4036989604
+4036989605
+4036989606
+4036989607
+4036989608
+4036989609
+4036989610
+4036989611
+4036989612
+4036989613
+4036989614
+4036989615
+4036989616
+4036989617
+4036989618
+4036989619
+4036989620
+4036989621
+4036989622
+4036989623
+4036989624
+4036989625
+4036989626
+4036989627
+4036989628
+4036989629
+4036989630
+4036989631
+4036989824
+4036989825
+4036989826
+4036989827
+4036989828
+4036989829
+4036989830
+4036989831
+4036989832
+4036989833
+4036989834
+4036989835
+4036989836
+4036989837
+4036989838
+4036989839
+4036989840
+4036989841
+4036989842
+4036989843
+4036989844
+4036989845
+4036989846
+4036989847
+4036989848
+4036989849
+4036989850
+4036989851
+4036989852
+4036989853
+4036989854
+4036989855
+4036989856
+4036989857
+4036989858
+4036989859
+4036989860
+4036989861
+4036989862
+4036989863
+4036989864
+4036989865
+4036989866
+4036989867
+4036989868
+4036989869
+4036989870
+4036989871
+4036989872
+4036989873
+4036989874
+4036989875
+4036989876
+4036989877
+4036989878
+4036989879
+4036989880
+4036989881
+4036989882
+4036989883
+4036989884
+4036989885
+4036989886
+4036989887
+4036990080
+4036990081
+4036990082
+4036990083
+4036990084
+4036990085
+4036990086
+4036990087
+4036990088
+4036990089
+4036990090
+4036990091
+4036990092
+4036990093
+4036990094
+4036990095
+4036990096
+4036990097
+4036990098
+4036990099
+4036990100
+4036990101
+4036990102
+4036990103
+4036990104
+4036990105
+4036990106
+4036990107
+4036990108
+4036990109
+4036990110
+4036990111
+4036990112
+4036990113
+4036990114
+4036990115
+4036990116
+4036990117
+4036990118
+4036990119
+4036990120
+4036990121
+4036990122
+4036990123
+4036990124
+4036990125
+4036990126
+4036990127
+4036990128
+4036990129
+4036990130
+4036990131
+4036990132
+4036990133
+4036990134
+4036990135
+4036990136
+4036990137
+4036990138
+4036990139
+4036990140
+4036990141
+4036990142
+4036990143
+4036990336
+4036990337
+4036990338
+4036990339
+4036990340
+4036990341
+4036990342
+4036990343
+4036990344
+4036990345
+4036990346
+4036990347
+4036990348
+4036990349
+4036990350
+4036990351
+4036990352
+4036990353
+4036990354
+4036990355
+4036990356
+4036990357
+4036990358
+4036990359
+4036990360
+4036990361
+4036990362
+4036990363
+4036990364
+4036990365
+4036990366
+4036990367
+4036990368
+4036990369
+4036990370
+4036990371
+4036990372
+4036990373
+4036990374
+4036990375
+4036990376
+4036990377
+4036990378
+4036990379
+4036990380
+4036990381
+4036990382
+4036990383
+4036990384
+4036990385
+4036990386
+4036990387
+4036990388
+4036990389
+4036990390
+4036990391
+4036990392
+4036990393
+4036990394
+4036990395
+4036990396
+4036990397
+4036990398
+4036990399
+4036990592
+4036990593
+4036990594
+4036990595
+4036990596
+4036990597
+4036990598
+4036990599
+4036990600
+4036990601
+4036990602
+4036990603
+4036990604
+4036990605
+4036990606
+4036990607
+4036990608
+4036990609
+4036990610
+4036990611
+4036990612
+4036990613
+4036990614
+4036990615
+4036990616
+4036990617
+4036990618
+4036990619
+4036990620
+4036990621
+4036990622
+4036990623
+4036990624
+4036990625
+4036990626
+4036990627
+4036990628
+4036990629
+4036990630
+4036990631
+4036990632
+4036990633
+4036990634
+4036990635
+4036990636
+4036990637
+4036990638
+4036990639
+4036990640
+4036990641
+4036990642
+4036990643
+4036990644
+4036990645
+4036990646
+4036990647
+4036990648
+4036990649
+4036990650
+4036990651
+4036990652
+4036990653
+4036990654
+4036990655
+4036990848
+4036990849
+4036990850
+4036990851
+4036990852
+4036990853
+4036990854
+4036990855
+4036990856
+4036990857
+4036990858
+4036990859
+4036990860
+4036990861
+4036990862
+4036990863
+4036990864
+4036990865
+4036990866
+4036990867
+4036990868
+4036990869
+4036990870
+4036990871
+4036990872
+4036990873
+4036990874
+4036990875
+4036990876
+4036990877
+4036990878
+4036990879
+4036990880
+4036990881
+4036990882
+4036990883
+4036990884
+4036990885
+4036990886
+4036990887
+4036990888
+4036990889
+4036990890
+4036990891
+4036990892
+4036990893
+4036990894
+4036990895
+4036990896
+4036990897
+4036990898
+4036990899
+4036990900
+4036990901
+4036990902
+4036990903
+4036990904
+4036990905
+4036990906
+4036990907
+4036990908
+4036990909
+4036990910
+4036990911
+4036991104
+4036991105
+4036991106
+4036991107
+4036991108
+4036991109
+4036991110
+4036991111
+4036991112
+4036991113
+4036991114
+4036991115
+4036991116
+4036991117
+4036991118
+4036991119
+4036991120
+4036991121
+4036991122
+4036991123
+4036991124
+4036991125
+4036991126
+4036991127
+4036991128
+4036991129
+4036991130
+4036991131
+4036991132
+4036991133
+4036991134
+4036991135
+4036991136
+4036991137
+4036991138
+4036991139
+4036991140
+4036991141
+4036991142
+4036991143
+4036991144
+4036991145
+4036991146
+4036991147
+4036991148
+4036991149
+4036991150
+4036991151
+4036991152
+4036991153
+4036991154
+4036991155
+4036991156
+4036991157
+4036991158
+4036991159
+4036991160
+4036991161
+4036991162
+4036991163
+4036991164
+4036991165
+4036991166
+4036991167
+4036991360
+4036991361
+4036991362
+4036991363
+4036991364
+4036991365
+4036991366
+4036991367
+4036991368
+4036991369
+4036991370
+4036991371
+4036991372
+4036991373
+4036991374
+4036991375
+4036991616
+4036991617
+4036991618
+4036991619
+4036991620
+4036991621
+4036991622
+4036991623
+4036991624
+4036991625
+4036991626
+4036991627
+4036991628
+4036991629
+4036991630
+4036991631
+4036991632
+4036991633
+4036991634
+4036991635
+4036991636
+4036991637
+4036991638
+4036991639
+4036991640
+4036991641
+4036991642
+4036991643
+4036991644
+4036991645
+4036991646
+4036991647
+4036991648
+4036991649
+4036991650
+4036991651
+4036991652
+4036991653
+4036991654
+4036991655
+4036991656
+4036991657
+4036991658
+4036991659
+4036991660
+4036991661
+4036991662
+4036991663
+4036991664
+4036991665
+4036991666
+4036991667
+4036991668
+4036991669
+4036991670
+4036991671
+4036991672
+4036991673
+4036991674
+4036991675
+4036991676
+4036991677
+4036991678
+4036991679
+4036991872
+4036991873
+4036991874
+4036991875
+4036991876
+4036991877
+4036991878
+4036991879
+4036991880
+4036991881
+4036991882
+4036991883
+4036991884
+4036991885
+4036991886
+4036991887
+4036991888
+4036991889
+4036991890
+4036991891
+4036991892
+4036991893
+4036991894
+4036991895
+4036991896
+4036991897
+4036991898
+4036991899
+4036991900
+4036991901
+4036991902
+4036991903
+4036991904
+4036991905
+4036991906
+4036991907
+4036991908
+4036991909
+4036991910
+4036991911
+4036991912
+4036991913
+4036991914
+4036991915
+4036991916
+4036991917
+4036991918
+4036991919
+4036991920
+4036991921
+4036991922
+4036991923
+4036991924
+4036991925
+4036991926
+4036991927
+4036991928
+4036991929
+4036991930
+4036991931
+4036991932
+4036991933
+4036991934
+4036991935
+4036992928
+4036992929
+4036992930
+4036992931
+4036992932
+4036992933
+4036992934
+4036992935
+4036992936
+4036992937
+4036992938
+4036992939
+4036992944
+4036994176
+4036994177
+4036994178
+4036994179
+4036994180
+4036994181
+4036994182
+4036994183
+4036994184
+4036994185
+4036994186
+4036994187
+4036994188
+4036994189
+4036994190
+4036994191
+4036994192
+4036994193
+4036994194
+4036994195
+4036994196
+4036994197
+4036994198
+4036994199
+4036994200
+4036994201
+4036994202
+4036994203
+4036994204
+4036994205
+4036994206
+4036994207
+4036994208
+4036994209
+4036994210
+4036994211
+4036994212
+4036994213
+4036994214
+4036994215
+4036994216
+4036994217
+4036994218
+4036994219
+4036994220
+4036994221
+4036994222
+4036994223
+4036994224
+4036994225
+4036994226
+4036994227
+4036994228
+4036994229
+4036994230
+4036994231
+4036994232
+4036994233
+4036994234
+4036994235
+4036994236
+4036994237
+4036994238
+4036994239
+4036994432
+4036994433
+4036994434
+4036994435
+4036994436
+4036994437
+4036994438
+4036994439
+4036994440
+4036994441
+4036994442
+4036994443
+4036994444
+4036994445
+4036994446
+4036994447
+4036994448
+4036994449
+4036994450
+4036994451
+4036994452
+4036994453
+4036994454
+4036994455
+4036994456
+4036994457
+4036994458
+4036994459
+4036994460
+4036994461
+4036994462
+4036994463
+4036994464
+4036994465
+4036994466
+4036994467
+4036994468
+4036994469
+4036994470
+4036994471
+4036994472
+4036994473
+4036994474
+4036994475
+4036994476
+4036994477
+4036994478
+4036994479
+4036994480
+4036994481
+4036994482
+4036994483
+4036994484
+4036994485
+4036994486
+4036994487
+4036994488
+4036994489
+4036994490
+4036994491
+4036994492
+4036994493
+4036994494
+4036994495
+4036994688
+4036994689
+4036994690
+4036994691
+4036994692
+4036994693
+4036994694
+4036994695
+4036994696
+4036994697
+4036994698
+4036994699
+4036994700
+4036994701
+4036994702
+4036994703
+4036994704
+4036994705
+4036994706
+4036994707
+4036994708
+4036994709
+4036994710
+4036994711
+4036994712
+4036994713
+4036994714
+4036994715
+4036994716
+4036994717
+4036994718
+4036994719
+4036994720
+4036994721
+4036994722
+4036994723
+4036994724
+4036994725
+4036994726
+4036994727
+4036994728
+4036994729
+4036994730
+4036994731
+4036994732
+4036994733
+4036994734
+4036994735
+4036994736
+4036994737
+4036994738
+4036994739
+4036994740
+4036994741
+4036994742
+4036994743
+4036994744
+4036994745
+4036994746
+4036994747
+4036994748
+4036994749
+4036994750
+4036994751
+4036994944
+4036994945
+4036994946
+4036994947
+4036994948
+4036994949
+4036994950
+4036994951
+4036994952
+4036994953
+4036994954
+4036994955
+4036994956
+4036994957
+4036994958
+4036994959
+4036994960
+4036994961
+4036994962
+4036994963
+4036994964
+4036994965
+4036994966
+4036994967
+4036994968
+4036994969
+4036994970
+4036994971
+4036994972
+4036994973
+4036994974
+4036994975
+4036994976
+4036994977
+4036994978
+4036994979
+4036994980
+4036994981
+4036994982
+4036994983
+4036994984
+4036994985
+4036994986
+4036994987
+4036994988
+4036994989
+4036994990
+4036994991
+4036994992
+4036994993
+4036994994
+4036994995
+4036994996
+4036994997
+4036994998
+4036994999
+4036995000
+4036995001
+4036995002
+4036995003
+4036995004
+4036995005
+4036995006
+4036995007
+4036995504
+4036995505
+4036995506
+4036995507
+4036995508
+4036995512
+4036995513
+4036995514
+4036995515
+4036995516
+4036995712
+4036995713
+4036995714
+4036995715
+4036995716
+4036995717
+4036995718
+4036995728
+4036995729
+4036995730
+4036995731
+4036995732
+4036995733
+4036995734
+4036995735
+4036995736
+4036995737
+4036995738
+4036995739
+4036995740
+4036995741
+4036995742
+4036995743
+4036995744
+4036995745
+4036995746
+4036995747
+4036995748
+4036995749
+4036995750
+4036995751
+4036995752
+4036995753
+4036995754
+4036995755
+4036995756
+4036995760
+4036995761
+4036995762
+4036995763
+4036995764
+4036995765
+4036995766
+4036995767
+4036995768
+4036995769
+4036995770
+4036995968
+4036995969
+4036995970
+4036995971
+4036995972
+4036995973
+4036995984
+4036995985
+4036995986
+4036995987
+4036995988
+4036995989
+4036995990
+4036995991
+4036995992
+4036995993
+4036996000
+4036996001
+4036996002
+4036996003
+4036996004
+4036996005
+4036996006
+4036996007
+4036996016
+4036996017
+4036996018
+4036996019
+4036996020
+4036996021
+4036996022
+14844296
+14844297
+14845090
+14845113
+14845584
+14845585
+14845586
+14845587
+14845588
+14845589
+14845590
+14845591
+14845592
+14845593
+14845594
+14845595
+14845596
+14845597
+14845598
+14845599
+14845600
+14845601
+14845602
+14845603
+14845604
+14845605
+14845606
+14845607
+14845608
+14845609
+14845610
+14845611
+14845612
+14845613
+14845614
+14845615
+14845616
+14845617
+14845618
+14845619
+14845620
+14845621
+14845622
+14845623
+14845624
+14845625
+14845626
+14845627
+14845628
+14845629
+14845630
+14845631
+14845824
+14845825
+14845826
+14845827
+14845828
+14845829
+14845830
+14845831
+14845832
+14845833
+14845834
+14845835
+14845836
+14845837
+14845838
+14845839
+14845840
+14845841
+14845842
+14845843
+14845844
+14845845
+14845846
+14845847
+14845848
+14845849
+14845850
+14845851
+14845852
+14845853
+14845854
+14845855
+14845856
+14845857
+14845858
+14845859
+14845860
+14845861
+14845862
+14845863
+14845864
+14845865
+14845866
+14845867
+14845868
+14845869
+14845870
+14845871
+14845872
+14845873
+14845874
+14845875
+14845876
+14845877
+14845878
+14845879
+14845880
+14845881
+14845882
+14845883
+14845884
+14845885
+14845886
+14845887
+14847130
+14847131
+14847144
+14847887
+14847913
+14847914
+14847915
+14847916
+14847917
+14847918
+14847919
+14847920
+14847921
+14847922
+14847923
+14847928
+14847929
+14847930
+14849706
+14849707
+14849718
+14849920
+14849979
+14849980
+14849981
+14849982
+14850176
+14850177
+14850178
+14850179
+14850180
+14850181
+14850182
+14850183
+14850184
+14850185
+14850186
+14850187
+14850188
+14850189
+14850190
+14850191
+14850192
+14850193
+14850194
+14850195
+14850196
+14850197
+14850198
+14850199
+14850200
+14850201
+14850202
+14850203
+14850204
+14850205
+14850206
+14850207
+14850208
+14850209
+14850210
+14850211
+14850212
+14850213
+14850214
+14850215
+14850216
+14850217
+14850218
+14850219
+14850220
+14850221
+14850222
+14850223
+14850224
+14850225
+14850226
+14850227
+14850228
+14850229
+14850230
+14850231
+14850232
+14850233
+14850234
+14850235
+14850236
+14850237
+14850238
+14850239
+14850432
+14850433
+14850434
+14850435
+14850436
+14850437
+14850438
+14850439
+14850440
+14850441
+14850442
+14850443
+14850444
+14850445
+14850446
+14850447
+14850448
+14850449
+14850450
+14850451
+14850452
+14850453
+14850454
+14850455
+14850456
+14850457
+14850458
+14850459
+14850460
+14850461
+14850462
+14850463
+14850464
+14850465
+14850466
+14850467
+14850468
+14850469
+14850470
+14850471
+14850472
+14850473
+14850474
+14850475
+14850476
+14850477
+14850478
+14850479
+14850480
+14850481
+14850482
+14850483
+14850484
+14850485
+14850486
+14850487
+14850488
+14850489
+14850490
+14850491
+14850492
+14850493
+14850494
+14850495
+14850688
+14850689
+14850690
+14850691
+14850692
+14850693
+14850694
+14850695
+14850696
+14850697
+14850698
+14850699
+14850700
+14850701
+14850702
+14850703
+14850704
+14850705
+14850706
+14850707
+14850708
+14850709
+14850710
+14850711
+14850712
+14850713
+14850714
+14850715
+14850716
+14850717
+14850718
+14850719
+14850720
+14850721
+14850722
+14850723
+14850724
+14850725
+14850726
+14850727
+14850728
+14850729
+14850730
+14850731
+14850732
+14850733
+14850734
+14850735
+14850736
+14850737
+14850738
+14850739
+14850740
+14850741
+14850742
+14850743
+14850744
+14850745
+14850746
+14850747
+14850748
+14850749
+14850750
+14850751
+14850944
+14850945
+14850946
+14850947
+14850948
+14850949
+14850950
+14850951
+14850952
+14850953
+14850954
+14850955
+14850956
+14850957
+14850958
+14850959
+14850960
+14850961
+14850962
+14850963
+14850964
+14850965
+14850966
+14850967
+14850968
+14850969
+14850970
+14850971
+14850972
+14850973
+14850974
+14850975
+14850976
+14850977
+14850978
+14850979
+14850980
+14850981
+14850982
+14850983
+14850984
+14850985
+14850986
+14850987
+14850988
+14850989
+14850990
+14850991
+14850992
+14850993
+14850994
+14850995
+14850996
+14850997
+14850998
+14850999
+14851000
+14851001
+14851002
+14851003
+14851004
+14851005
+14851006
+14851007
+14851200
+14851201
+14851202
+14851203
+14851204
+14851205
+14851206
+14851207
+14851208
+14851209
+14851210
+14851211
+14851212
+14851213
+14851214
+14851215
+14851216
+14851217
+14851218
+14851219
+14851220
+14851221
+14851222
+14851223
+14851224
+14851225
+14851226
+14851227
+14851228
+14851229
+14851230
+14851231
+14851232
+14851233
+14851234
+14851235
+14851236
+14851237
+14851238
+14851239
+14851240
+14851241
+14851242
+14851243
+14851244
+14851245
+14851246
+14851247
+14851248
+14851249
+14851250
+14851251
+14851252
+14851253
+14851254
+14851255
+14851256
+14851257
+14851258
+14851259
+14851260
+14851261
+14851262
+14851263
+14851456
+14851457
+14851458
+14851459
+14851460
+14851461
+14851462
+14851463
+14851464
+14851465
+14851466
+14851467
+14851468
+14851469
+14851470
+14851471
+14851472
+14851473
+14851474
+14851475
+14851476
+14851477
+14851478
+14851479
+14851480
+14851481
+14851482
+14851483
+14851484
+14851485
+14851486
+14851487
+14851488
+14851489
+14851490
+14851491
+14851492
+14851493
+14851494
+14851495
+14851496
+14851497
+14851498
+14851499
+14851500
+14851501
+14851502
+14851503
+14851504
+14851505
+14851506
+14851507
+14851508
+14851509
+14851510
+14851511
+14851512
+14851513
+14851514
+14851515
+14851516
+14851517
+14851518
+14851519
+14851712
+14851713
+14851714
+14851715
+14851716
+14851717
+14851718
+14851719
+14851720
+14851721
+14851722
+14851723
+14851724
+14851725
+14851726
+14851727
+14851728
+14851729
+14851730
+14851731
+14851732
+14851733
+14851734
+14851735
+14851736
+14851737
+14851738
+14851739
+14851740
+14851741
+14851742
+14851743
+14851744
+14851745
+14851746
+14851747
+14851748
+14851749
+14851750
+14851751
+14851752
+14851753
+14851754
+14851755
+14851756
+14851757
+14851758
+14851759
+14851760
+14851761
+14851762
+14851763
+14851764
+14851765
+14851766
+14851767
+14851768
+14851769
+14851770
+14851771
+14851772
+14851773
+14851774
+14851775
+14853300
+14853301
+14855301
+14855302
+14855303
+14855323
+14855324
+14855568
+14855573
+14909616
+14909629
+14912151
+14912153
diff --git a/level_0/f_utf/data/tests/codepoints/control-all.txt b/level_0/f_utf/data/tests/codepoints/control-all.txt
new file mode 100644 (file)
index 0000000..7d8df7b
--- /dev/null
@@ -0,0 +1,65 @@
+U+0000
+U+0001
+U+0002
+U+0003
+U+0004
+U+0005
+U+0006
+U+0007
+U+0008
+U+0009
+U+000A
+U+000B
+U+000C
+U+000D
+U+000E
+U+000F
+U+0010
+U+0011
+U+0012
+U+0013
+U+0014
+U+0015
+U+0016
+U+0017
+U+0018
+U+0019
+U+001A
+U+001B
+U+001C
+U+001D
+U+001E
+U+001F
+U+007F
+U+0080
+U+0081
+U+0082
+U+0083
+U+0084
+U+0085
+U+0086
+U+0087
+U+0088
+U+0089
+U+008A
+U+008B
+U+008C
+U+008D
+U+008E
+U+008F
+U+0090
+U+0091
+U+0092
+U+0093
+U+0094
+U+0095
+U+0096
+U+0097
+U+0098
+U+0099
+U+009A
+U+009B
+U+009C
+U+009D
+U+009E
+U+009F
diff --git a/level_0/f_utf/data/tests/codepoints/digit-all.txt b/level_0/f_utf/data/tests/codepoints/digit-all.txt
new file mode 100644 (file)
index 0000000..4f954bd
--- /dev/null
@@ -0,0 +1,650 @@
+U+0030
+U+0031
+U+0032
+U+0033
+U+0034
+U+0035
+U+0036
+U+0037
+U+0038
+U+0039
+U+0660
+U+0661
+U+0662
+U+0663
+U+0664
+U+0665
+U+0666
+U+0667
+U+0668
+U+0669
+U+06F0
+U+06F1
+U+06F2
+U+06F3
+U+06F4
+U+06F5
+U+06F6
+U+06F7
+U+06F8
+U+06F9
+U+07C0
+U+07C1
+U+07C2
+U+07C3
+U+07C4
+U+07C5
+U+07C6
+U+07C7
+U+07C8
+U+07C9
+U+0966
+U+0967
+U+0968
+U+0969
+U+096A
+U+096B
+U+096C
+U+096D
+U+096E
+U+096F
+U+09E6
+U+09E7
+U+09E8
+U+09E9
+U+09EA
+U+09EB
+U+09EC
+U+09ED
+U+09EE
+U+09EF
+U+0A66
+U+0A67
+U+0A68
+U+0A69
+U+0A6A
+U+0A6B
+U+0A6C
+U+0A6D
+U+0A6E
+U+0A6F
+U+0AE6
+U+0AE7
+U+0AE8
+U+0AE9
+U+0AEA
+U+0AEB
+U+0AEC
+U+0AED
+U+0AEE
+U+0AEF
+U+0B66
+U+0B67
+U+0B68
+U+0B69
+U+0B6A
+U+0B6B
+U+0B6C
+U+0B6D
+U+0B6E
+U+0B6F
+U+0BE6
+U+0BE7
+U+0BE8
+U+0BE9
+U+0BEA
+U+0BEB
+U+0BEC
+U+0BED
+U+0BEE
+U+0BEF
+U+0C66
+U+0C67
+U+0C68
+U+0C69
+U+0C6A
+U+0C6B
+U+0C6C
+U+0C6D
+U+0C6E
+U+0C6F
+U+0CE6
+U+0CE7
+U+0CE8
+U+0CE9
+U+0CEA
+U+0CEB
+U+0CEC
+U+0CED
+U+0CEE
+U+0CEF
+U+0D66
+U+0D67
+U+0D68
+U+0D69
+U+0D6A
+U+0D6B
+U+0D6C
+U+0D6D
+U+0D6E
+U+0D6F
+U+0DE6
+U+0DE7
+U+0DE8
+U+0DE9
+U+0DEA
+U+0DEB
+U+0DEC
+U+0DED
+U+0DEE
+U+0DEF
+U+0E50
+U+0E51
+U+0E52
+U+0E53
+U+0E54
+U+0E55
+U+0E56
+U+0E57
+U+0E58
+U+0E59
+U+0ED0
+U+0ED1
+U+0ED2
+U+0ED3
+U+0ED4
+U+0ED5
+U+0ED6
+U+0ED7
+U+0ED8
+U+0ED9
+U+0F20
+U+0F21
+U+0F22
+U+0F23
+U+0F24
+U+0F25
+U+0F26
+U+0F27
+U+0F28
+U+0F29
+U+1040
+U+1041
+U+1042
+U+1043
+U+1044
+U+1045
+U+1046
+U+1047
+U+1048
+U+1049
+U+104A0
+U+104A1
+U+104A2
+U+104A3
+U+104A4
+U+104A5
+U+104A6
+U+104A7
+U+104A8
+U+104A9
+U+1090
+U+1091
+U+1092
+U+1093
+U+1094
+U+1095
+U+1096
+U+1097
+U+1098
+U+1099
+U+10D30
+U+10D31
+U+10D32
+U+10D33
+U+10D34
+U+10D35
+U+10D36
+U+10D37
+U+10D38
+U+10D39
+U+11066
+U+11067
+U+11068
+U+11069
+U+1106A
+U+1106B
+U+1106C
+U+1106D
+U+1106E
+U+1106F
+U+110F0
+U+110F1
+U+110F2
+U+110F3
+U+110F4
+U+110F5
+U+110F6
+U+110F7
+U+110F8
+U+110F9
+U+11136
+U+11137
+U+11138
+U+11139
+U+1113A
+U+1113B
+U+1113C
+U+1113D
+U+1113E
+U+1113F
+U+111D0
+U+111D1
+U+111D2
+U+111D3
+U+111D4
+U+111D5
+U+111D6
+U+111D7
+U+111D8
+U+111D9
+U+112F0
+U+112F1
+U+112F2
+U+112F3
+U+112F4
+U+112F5
+U+112F6
+U+112F7
+U+112F8
+U+112F9
+U+11450
+U+11451
+U+11452
+U+11453
+U+11454
+U+11455
+U+11456
+U+11457
+U+11458
+U+11459
+U+114D0
+U+114D1
+U+114D2
+U+114D3
+U+114D4
+U+114D5
+U+114D6
+U+114D7
+U+114D8
+U+114D9
+U+11650
+U+11651
+U+11652
+U+11653
+U+11654
+U+11655
+U+11656
+U+11657
+U+11658
+U+11659
+U+116C0
+U+116C1
+U+116C2
+U+116C3
+U+116C4
+U+116C5
+U+116C6
+U+116C7
+U+116C8
+U+116C9
+U+11730
+U+11731
+U+11732
+U+11733
+U+11734
+U+11735
+U+11736
+U+11737
+U+11738
+U+11739
+U+118E0
+U+118E1
+U+118E2
+U+118E3
+U+118E4
+U+118E5
+U+118E6
+U+118E7
+U+118E8
+U+118E9
+U+11950
+U+11951
+U+11952
+U+11953
+U+11954
+U+11955
+U+11956
+U+11957
+U+11958
+U+11959
+U+11C50
+U+11C51
+U+11C52
+U+11C53
+U+11C54
+U+11C55
+U+11C56
+U+11C57
+U+11C58
+U+11C59
+U+11D50
+U+11D51
+U+11D52
+U+11D53
+U+11D54
+U+11D55
+U+11D56
+U+11D57
+U+11D58
+U+11D59
+U+11DA0
+U+11DA1
+U+11DA2
+U+11DA3
+U+11DA4
+U+11DA5
+U+11DA6
+U+11DA7
+U+11DA8
+U+11DA9
+U+16A60
+U+16A61
+U+16A62
+U+16A63
+U+16A64
+U+16A65
+U+16A66
+U+16A67
+U+16A68
+U+16A69
+U+16B50
+U+16B51
+U+16B52
+U+16B53
+U+16B54
+U+16B55
+U+16B56
+U+16B57
+U+16B58
+U+16B59
+U+17E0
+U+17E1
+U+17E2
+U+17E3
+U+17E4
+U+17E5
+U+17E6
+U+17E7
+U+17E8
+U+17E9
+U+1810
+U+1811
+U+1812
+U+1813
+U+1814
+U+1815
+U+1816
+U+1817
+U+1818
+U+1819
+U+1946
+U+1947
+U+1948
+U+1949
+U+194A
+U+194B
+U+194C
+U+194D
+U+194E
+U+194F
+U+19D0
+U+19D1
+U+19D2
+U+19D3
+U+19D4
+U+19D5
+U+19D6
+U+19D7
+U+19D8
+U+19D9
+U+1A80
+U+1A81
+U+1A82
+U+1A83
+U+1A84
+U+1A85
+U+1A86
+U+1A87
+U+1A88
+U+1A89
+U+1A90
+U+1A91
+U+1A92
+U+1A93
+U+1A94
+U+1A95
+U+1A96
+U+1A97
+U+1A98
+U+1A99
+U+1B50
+U+1B51
+U+1B52
+U+1B53
+U+1B54
+U+1B55
+U+1B56
+U+1B57
+U+1B58
+U+1B59
+U+1BB0
+U+1BB1
+U+1BB2
+U+1BB3
+U+1BB4
+U+1BB5
+U+1BB6
+U+1BB7
+U+1BB8
+U+1BB9
+U+1C40
+U+1C41
+U+1C42
+U+1C43
+U+1C44
+U+1C45
+U+1C46
+U+1C47
+U+1C48
+U+1C49
+U+1C50
+U+1C51
+U+1C52
+U+1C53
+U+1C54
+U+1C55
+U+1C56
+U+1C57
+U+1C58
+U+1C59
+U+1D7CE
+U+1D7CF
+U+1D7D0
+U+1D7D1
+U+1D7D2
+U+1D7D3
+U+1D7D4
+U+1D7D5
+U+1D7D6
+U+1D7D7
+U+1D7D8
+U+1D7D9
+U+1D7DA
+U+1D7DB
+U+1D7DC
+U+1D7DD
+U+1D7DE
+U+1D7DF
+U+1D7E0
+U+1D7E1
+U+1D7E2
+U+1D7E3
+U+1D7E4
+U+1D7E5
+U+1D7E6
+U+1D7E7
+U+1D7E8
+U+1D7E9
+U+1D7EA
+U+1D7EB
+U+1D7EC
+U+1D7ED
+U+1D7EE
+U+1D7EF
+U+1D7F0
+U+1D7F1
+U+1D7F2
+U+1D7F3
+U+1D7F4
+U+1D7F5
+U+1D7F6
+U+1D7F7
+U+1D7F8
+U+1D7F9
+U+1D7FA
+U+1D7FB
+U+1D7FC
+U+1D7FD
+U+1D7FE
+U+1D7FF
+U+1E140
+U+1E141
+U+1E142
+U+1E143
+U+1E144
+U+1E145
+U+1E146
+U+1E147
+U+1E148
+U+1E149
+U+1E2F0
+U+1E2F1
+U+1E2F2
+U+1E2F3
+U+1E2F4
+U+1E2F5
+U+1E2F6
+U+1E2F7
+U+1E2F8
+U+1E2F9
+U+1E950
+U+1E951
+U+1E952
+U+1E953
+U+1E954
+U+1E955
+U+1E956
+U+1E957
+U+1E958
+U+1E959
+U+1FBF0
+U+1FBF1
+U+1FBF2
+U+1FBF3
+U+1FBF4
+U+1FBF5
+U+1FBF6
+U+1FBF7
+U+1FBF8
+U+1FBF9
+U+A620
+U+A621
+U+A622
+U+A623
+U+A624
+U+A625
+U+A626
+U+A627
+U+A628
+U+A629
+U+A8D0
+U+A8D1
+U+A8D2
+U+A8D3
+U+A8D4
+U+A8D5
+U+A8D6
+U+A8D7
+U+A8D8
+U+A8D9
+U+A900
+U+A901
+U+A902
+U+A903
+U+A904
+U+A905
+U+A906
+U+A907
+U+A908
+U+A909
+U+A9D0
+U+A9D1
+U+A9D2
+U+A9D3
+U+A9D4
+U+A9D5
+U+A9D6
+U+A9D7
+U+A9D8
+U+A9D9
+U+A9F0
+U+A9F1
+U+A9F2
+U+A9F3
+U+A9F4
+U+A9F5
+U+A9F6
+U+A9F7
+U+A9F8
+U+A9F9
+U+AA50
+U+AA51
+U+AA52
+U+AA53
+U+AA54
+U+AA55
+U+AA56
+U+AA57
+U+AA58
+U+AA59
+U+ABF0
+U+ABF1
+U+ABF2
+U+ABF3
+U+ABF4
+U+ABF5
+U+ABF6
+U+ABF7
+U+ABF8
+U+ABF9
+U+FF10
+U+FF11
+U+FF12
+U+FF13
+U+FF14
+U+FF15
+U+FF16
+U+FF17
+U+FF18
+U+FF19
diff --git a/level_0/f_utf/data/tests/codepoints/emoji-all.txt b/level_0/f_utf/data/tests/codepoints/emoji-all.txt
new file mode 100644 (file)
index 0000000..53ce47b
--- /dev/null
@@ -0,0 +1,1980 @@
+U+00A9
+U+00AE
+U+1F004
+U+1F0CF 
+U+1F170
+U+1F171
+U+1F17E
+U+1F17F
+U+1F18E
+U+1F191
+U+1F192
+U+1F193
+U+1F194
+U+1F195
+U+1F196
+U+1F197
+U+1F198
+U+1F199
+U+1F19A
+U+1F1E6
+U+1F1E7
+U+1F1E8
+U+1F1E9
+U+1F1EA
+U+1F1EB
+U+1F1EC
+U+1F1ED
+U+1F1EE
+U+1F1EF
+U+1F201
+U+1F202
+U+1F21A
+U+1F22F
+U+1F232
+U+1F233
+U+1F234
+U+1F235
+U+1F236
+U+1F237
+U+1F238
+U+1F239
+U+1F23A
+U+1F250
+U+1F251
+U+1F300
+U+1F301
+U+1F302
+U+1F303
+U+1F304
+U+1F305
+U+1F306
+U+1F307
+U+1F308
+U+1F309
+U+1F30A
+U+1F30B
+U+1F30C
+U+1F30D
+U+1F30E
+U+1F30F
+U+1F310
+U+1F311
+U+1F312
+U+1F313
+U+1F314
+U+1F315
+U+1F316
+U+1F317
+U+1F318
+U+1F319
+U+1F31A
+U+1F31B
+U+1F31C
+U+1F31D
+U+1F31E
+U+1F31F
+U+1F320
+U+1F321
+U+1F322
+U+1F323
+U+1F324
+U+1F325
+U+1F326
+U+1F327
+U+1F328
+U+1F329
+U+1F32A
+U+1F32B
+U+1F32C
+U+1F32D
+U+1F32E
+U+1F32F
+U+1F330
+U+1F331
+U+1F332
+U+1F333
+U+1F334
+U+1F335
+U+1F336
+U+1F337
+U+1F338
+U+1F339
+U+1F33A
+U+1F33B
+U+1F33C
+U+1F33D
+U+1F33E
+U+1F33F
+U+1F340
+U+1F341
+U+1F342
+U+1F343
+U+1F344
+U+1F345
+U+1F346
+U+1F347
+U+1F348
+U+1F349
+U+1F34A
+U+1F34B
+U+1F34C
+U+1F34D
+U+1F34E
+U+1F34F
+U+1F350
+U+1F351
+U+1F352
+U+1F353
+U+1F354
+U+1F355
+U+1F356
+U+1F357
+U+1F358
+U+1F359
+U+1F35A
+U+1F35B
+U+1F35C
+U+1F35D
+U+1F35E
+U+1F35F
+U+1F360
+U+1F361
+U+1F362
+U+1F363
+U+1F364
+U+1F365
+U+1F366
+U+1F367
+U+1F368
+U+1F369
+U+1F36A
+U+1F36B
+U+1F36C
+U+1F36D
+U+1F36E
+U+1F36F
+U+1F370
+U+1F371
+U+1F372
+U+1F373
+U+1F374
+U+1F375
+U+1F376
+U+1F377
+U+1F378
+U+1F379
+U+1F37A
+U+1F37B
+U+1F37C
+U+1F37D
+U+1F37E
+U+1F37F
+U+1F380
+U+1F381
+U+1F382
+U+1F383
+U+1F384
+U+1F385
+U+1F386
+U+1F387
+U+1F388
+U+1F389
+U+1F38A
+U+1F38B
+U+1F38C
+U+1F38D
+U+1F38E
+U+1F38F
+U+1F390
+U+1F391
+U+1F392
+U+1F393
+U+1F394
+U+1F395
+U+1F396
+U+1F397
+U+1F398
+U+1F399
+U+1F39A
+U+1F39B
+U+1F39C
+U+1F39D
+U+1F39E
+U+1F39F
+U+1F3A0
+U+1F3A1
+U+1F3A2
+U+1F3A3
+U+1F3A4
+U+1F3A5
+U+1F3A6
+U+1F3A7
+U+1F3A8
+U+1F3A9
+U+1F3AA
+U+1F3AB
+U+1F3AC
+U+1F3AD
+U+1F3AE
+U+1F3AF
+U+1F3B0
+U+1F3B1
+U+1F3B2
+U+1F3B3
+U+1F3B4
+U+1F3B5
+U+1F3B6
+U+1F3B7
+U+1F3B8
+U+1F3B9
+U+1F3BA
+U+1F3BB
+U+1F3BC
+U+1F3BD
+U+1F3BE
+U+1F3BF
+U+1F3C0
+U+1F3C1
+U+1F3C2
+U+1F3C3
+U+1F3C4
+U+1F3C5
+U+1F3C6
+U+1F3C7
+U+1F3C8
+U+1F3C9
+U+1F3CA
+U+1F3CB
+U+1F3CC
+U+1F3CD
+U+1F3CE
+U+1F3CF
+U+1F3D0
+U+1F3D1
+U+1F3D2
+U+1F3D3
+U+1F3D4
+U+1F3D5
+U+1F3D6
+U+1F3D7
+U+1F3D8
+U+1F3D9
+U+1F3DA
+U+1F3DB
+U+1F3DC
+U+1F3DD
+U+1F3DE
+U+1F3DF
+U+1F3E0
+U+1F3E1
+U+1F3E2
+U+1F3E3
+U+1F3E4
+U+1F3E5
+U+1F3E6
+U+1F3E7
+U+1F3E8
+U+1F3E9
+U+1F3EA
+U+1F3EB
+U+1F3EC
+U+1F3ED
+U+1F3EE
+U+1F3EF
+U+1F3F0
+U+1F3F1
+U+1F3F2
+U+1F3F3
+U+1F3F4
+U+1F3F5
+U+1F3F6
+U+1F3F7
+U+1F3F8
+U+1F3F9
+U+1F3FA
+U+1F3FB
+U+1F3FC
+U+1F3FD
+U+1F3FE
+U+1F3FF
+U+1F400
+U+1F401
+U+1F402
+U+1F403
+U+1F404
+U+1F405
+U+1F406
+U+1F407
+U+1F408
+U+1F409
+U+1F40A
+U+1F40B
+U+1F40C
+U+1F40D
+U+1F40E
+U+1F40F
+U+1F410
+U+1F411
+U+1F412
+U+1F413
+U+1F414
+U+1F415
+U+1F416
+U+1F417
+U+1F418
+U+1F419
+U+1F41A
+U+1F41B
+U+1F41C
+U+1F41D
+U+1F41E
+U+1F41F
+U+1F420
+U+1F421
+U+1F422
+U+1F423
+U+1F424
+U+1F425
+U+1F426
+U+1F427
+U+1F428
+U+1F429
+U+1F42A
+U+1F42B
+U+1F42C
+U+1F42D
+U+1F42E
+U+1F42F
+U+1F430
+U+1F431
+U+1F432
+U+1F433
+U+1F434
+U+1F435
+U+1F436
+U+1F437
+U+1F438
+U+1F439
+U+1F43A
+U+1F43B
+U+1F43C
+U+1F43D
+U+1F43E
+U+1F43F
+U+1F440
+U+1F441
+U+1F442
+U+1F443
+U+1F444
+U+1F445
+U+1F446
+U+1F447
+U+1F448
+U+1F449
+U+1F44A
+U+1F44B
+U+1F44C
+U+1F44D
+U+1F44E
+U+1F44F
+U+1F450
+U+1F451
+U+1F452
+U+1F453
+U+1F454
+U+1F455
+U+1F456
+U+1F457
+U+1F458
+U+1F459
+U+1F45A
+U+1F45B
+U+1F45C
+U+1F45D
+U+1F45E
+U+1F45F
+U+1F460
+U+1F461
+U+1F462
+U+1F463
+U+1F464
+U+1F465
+U+1F466
+U+1F467
+U+1F468
+U+1F469
+U+1F46A
+U+1F46B
+U+1F46C
+U+1F46D
+U+1F46E
+U+1F46F
+U+1F470
+U+1F471
+U+1F472
+U+1F473
+U+1F474
+U+1F475
+U+1F476
+U+1F477
+U+1F478
+U+1F479
+U+1F47A
+U+1F47B
+U+1F47C
+U+1F47D
+U+1F47E
+U+1F47F
+U+1F480
+U+1F481
+U+1F482
+U+1F483
+U+1F484
+U+1F485
+U+1F486
+U+1F487
+U+1F488
+U+1F489
+U+1F48A
+U+1F48B
+U+1F48C
+U+1F48D
+U+1F48E
+U+1F48F
+U+1F490
+U+1F491
+U+1F492
+U+1F493
+U+1F494
+U+1F495
+U+1F496
+U+1F497
+U+1F498
+U+1F499
+U+1F49A
+U+1F49B
+U+1F49C
+U+1F49D
+U+1F49E
+U+1F49F
+U+1F4A0
+U+1F4A1
+U+1F4A2
+U+1F4A3
+U+1F4A4
+U+1F4A5
+U+1F4A6
+U+1F4A7
+U+1F4A8
+U+1F4A9
+U+1F4AA
+U+1F4AB
+U+1F4AC
+U+1F4AD
+U+1F4AE
+U+1F4AF
+U+1F4B0
+U+1F4B1
+U+1F4B2
+U+1F4B3
+U+1F4B4
+U+1F4B5
+U+1F4B6
+U+1F4B7
+U+1F4B8
+U+1F4B9
+U+1F4BA
+U+1F4BB
+U+1F4BC
+U+1F4BD
+U+1F4BE
+U+1F4BF
+U+1F4C0
+U+1F4C1
+U+1F4C2
+U+1F4C3
+U+1F4C4
+U+1F4C5
+U+1F4C6
+U+1F4C7
+U+1F4C8
+U+1F4C9
+U+1F4CA
+U+1F4CB
+U+1F4CC
+U+1F4CD
+U+1F4CE
+U+1F4CF
+U+1F4D0
+U+1F4D1
+U+1F4D2
+U+1F4D3
+U+1F4D4
+U+1F4D5
+U+1F4D6
+U+1F4D7
+U+1F4D8
+U+1F4D9
+U+1F4DA
+U+1F4DB
+U+1F4DC
+U+1F4DD
+U+1F4DE
+U+1F4DF
+U+1F4E0
+U+1F4E1
+U+1F4E2
+U+1F4E3
+U+1F4E4
+U+1F4E5
+U+1F4E6
+U+1F4E7
+U+1F4E8
+U+1F4E9
+U+1F4EA
+U+1F4EB
+U+1F4EC
+U+1F4ED
+U+1F4EE
+U+1F4EF
+U+1F4F0
+U+1F4F1
+U+1F4F2
+U+1F4F3
+U+1F4F4
+U+1F4F5
+U+1F4F6
+U+1F4F7
+U+1F4F8
+U+1F4F9
+U+1F4FA
+U+1F4FB
+U+1F4FC
+U+1F4FD
+U+1F4FE
+U+1F4FF
+U+1F500
+U+1F501
+U+1F502
+U+1F503
+U+1F504
+U+1F505
+U+1F506
+U+1F507
+U+1F508
+U+1F509
+U+1F50A
+U+1F50B
+U+1F50C
+U+1F50D
+U+1F50E
+U+1F50F
+U+1F510
+U+1F511
+U+1F512
+U+1F513
+U+1F514
+U+1F515
+U+1F516
+U+1F517
+U+1F518
+U+1F519
+U+1F51A
+U+1F51B
+U+1F51C
+U+1F51D
+U+1F51E
+U+1F51F
+U+1F520
+U+1F521
+U+1F522
+U+1F523
+U+1F524
+U+1F525
+U+1F526
+U+1F527
+U+1F528
+U+1F529
+U+1F52A
+U+1F52B
+U+1F52C
+U+1F52D
+U+1F52E
+U+1F52F
+U+1F530
+U+1F531
+U+1F532
+U+1F533
+U+1F534
+U+1F535
+U+1F536
+U+1F537
+U+1F538
+U+1F539
+U+1F53A
+U+1F53B
+U+1F53C
+U+1F53D
+U+1F53E
+U+1F53F
+U+1F540
+U+1F541
+U+1F542
+U+1F543
+U+1F544
+U+1F545
+U+1F546
+U+1F547
+U+1F548
+U+1F549
+U+1F54A
+U+1F54B
+U+1F54C
+U+1F54D
+U+1F54E
+U+1F54F
+U+1F550
+U+1F551
+U+1F552
+U+1F553
+U+1F554
+U+1F555
+U+1F556
+U+1F557
+U+1F558
+U+1F559
+U+1F55A
+U+1F55B
+U+1F55C
+U+1F55D
+U+1F55E
+U+1F55F
+U+1F560
+U+1F561
+U+1F562
+U+1F563
+U+1F564
+U+1F565
+U+1F566
+U+1F567
+U+1F568
+U+1F569
+U+1F56A
+U+1F56B
+U+1F56C
+U+1F56D
+U+1F56E
+U+1F56F
+U+1F570
+U+1F571
+U+1F572
+U+1F573
+U+1F574
+U+1F575
+U+1F576
+U+1F577
+U+1F578
+U+1F579
+U+1F57A
+U+1F57B
+U+1F57C
+U+1F57D
+U+1F57E
+U+1F57F
+U+1F580
+U+1F581
+U+1F582
+U+1F583
+U+1F584
+U+1F585
+U+1F586
+U+1F587
+U+1F588
+U+1F589
+U+1F58A
+U+1F58B
+U+1F58C
+U+1F58D
+U+1F58E
+U+1F58F
+U+1F590
+U+1F591
+U+1F592
+U+1F593
+U+1F594
+U+1F595
+U+1F596
+U+1F597
+U+1F598
+U+1F599
+U+1F59A
+U+1F59B
+U+1F59C
+U+1F59D
+U+1F59E
+U+1F59F
+U+1F5A0
+U+1F5A1
+U+1F5A2
+U+1F5A3
+U+1F5A4
+U+1F5A5
+U+1F5A6
+U+1F5A7
+U+1F5A8
+U+1F5A9
+U+1F5AA
+U+1F5AB
+U+1F5AC
+U+1F5AD
+U+1F5AE
+U+1F5AF
+U+1F5B0
+U+1F5B1
+U+1F5B2
+U+1F5B3
+U+1F5B4
+U+1F5B5
+U+1F5B6
+U+1F5B7
+U+1F5B8
+U+1F5B9
+U+1F5BA
+U+1F5BB
+U+1F5BC
+U+1F5BD
+U+1F5BE
+U+1F5BF
+U+1F5C0
+U+1F5C1
+U+1F5C2
+U+1F5C3
+U+1F5C4
+U+1F5C5
+U+1F5C6
+U+1F5C7
+U+1F5C8
+U+1F5C9
+U+1F5CA
+U+1F5CB
+U+1F5CC
+U+1F5CD
+U+1F5CE
+U+1F5CF
+U+1F5D0
+U+1F5D1
+U+1F5D2
+U+1F5D3
+U+1F5D4
+U+1F5D5
+U+1F5D6
+U+1F5D7
+U+1F5D8
+U+1F5D9
+U+1F5DA
+U+1F5DB
+U+1F5DC
+U+1F5DD
+U+1F5DE
+U+1F5DF
+U+1F5E0
+U+1F5E1
+U+1F5E2
+U+1F5E3
+U+1F5E4
+U+1F5E5
+U+1F5E6
+U+1F5E7
+U+1F5E8
+U+1F5E9
+U+1F5EA
+U+1F5EB
+U+1F5EC
+U+1F5ED
+U+1F5EE
+U+1F5EF
+U+1F5F0
+U+1F5F1
+U+1F5F2
+U+1F5F3
+U+1F5F4
+U+1F5F5
+U+1F5F6
+U+1F5F7
+U+1F5F8
+U+1F5F9
+U+1F5FA
+U+1F5FB
+U+1F5FC
+U+1F5FD
+U+1F5FE
+U+1F5FF
+U+1F600
+U+1F601
+U+1F602
+U+1F603
+U+1F604
+U+1F605
+U+1F606
+U+1F607
+U+1F608
+U+1F609
+U+1F60A
+U+1F60B
+U+1F60C
+U+1F60D
+U+1F60E
+U+1F60F
+U+1F610
+U+1F611
+U+1F612
+U+1F613
+U+1F614
+U+1F615
+U+1F616
+U+1F617
+U+1F618
+U+1F619
+U+1F61A
+U+1F61B
+U+1F61C
+U+1F61D
+U+1F61E
+U+1F61F
+U+1F620
+U+1F621
+U+1F622
+U+1F623
+U+1F624
+U+1F625
+U+1F626
+U+1F627
+U+1F628
+U+1F629
+U+1F62A
+U+1F62B
+U+1F62C
+U+1F62D
+U+1F62E
+U+1F62F
+U+1F630
+U+1F631
+U+1F632
+U+1F633
+U+1F634
+U+1F635
+U+1F636
+U+1F637
+U+1F638
+U+1F639
+U+1F63A
+U+1F63B
+U+1F63C
+U+1F63D
+U+1F63E
+U+1F63F
+U+1F640
+U+1F641
+U+1F642
+U+1F643
+U+1F644
+U+1F645
+U+1F646
+U+1F647
+U+1F648
+U+1F649
+U+1F64A
+U+1F64B
+U+1F64C
+U+1F64D
+U+1F64E
+U+1F64F
+U+1F680
+U+1F681
+U+1F682
+U+1F683
+U+1F684
+U+1F685
+U+1F686
+U+1F687
+U+1F688
+U+1F689
+U+1F68A
+U+1F68B
+U+1F68C
+U+1F68D
+U+1F68E
+U+1F68F
+U+1F690
+U+1F691
+U+1F692
+U+1F693
+U+1F694
+U+1F695
+U+1F696
+U+1F697
+U+1F698
+U+1F699
+U+1F69A
+U+1F69B
+U+1F69C
+U+1F69D
+U+1F69E
+U+1F69F
+U+1F6A0
+U+1F6A1
+U+1F6A2
+U+1F6A3
+U+1F6A4
+U+1F6A5
+U+1F6A6
+U+1F6A7
+U+1F6A8
+U+1F6A9
+U+1F6AA
+U+1F6AB
+U+1F6AC
+U+1F6AD
+U+1F6AE
+U+1F6AF
+U+1F6B0
+U+1F6B1
+U+1F6B2
+U+1F6B3
+U+1F6B4
+U+1F6B5
+U+1F6B6
+U+1F6B7
+U+1F6B8
+U+1F6B9
+U+1F6BA
+U+1F6BB
+U+1F6BC
+U+1F6BD
+U+1F6BE
+U+1F6BF
+U+1F6C0
+U+1F6C1
+U+1F6C2
+U+1F6C3
+U+1F6C4
+U+1F6C5
+U+1F6C6
+U+1F6C7
+U+1F6C8
+U+1F6C9
+U+1F6CA
+U+1F6CB
+U+1F6CC
+U+1F6CD
+U+1F6CE
+U+1F6CF
+U+1F6D0
+U+1F6D1
+U+1F6D2
+U+1F6D3
+U+1F6D4
+U+1F6D5
+U+1F6D6
+U+1F6D7
+U+1F6D8
+U+1F6D9
+U+1F6DA
+U+1F6DB
+U+1F6DC
+U+1F6DD
+U+1F6DE
+U+1F6DF
+U+1F6E0
+U+1F6E1
+U+1F6E2
+U+1F6E3
+U+1F6E4
+U+1F6E5
+U+1F6E6
+U+1F6E7
+U+1F6E8
+U+1F6E9
+U+1F6EA
+U+1F6EB
+U+1F6EC
+U+1F6ED
+U+1F6EE
+U+1F6EF
+U+1F6F0
+U+1F6F1
+U+1F6F2
+U+1F6F3
+U+1F6F4
+U+1F6F5
+U+1F6F6
+U+1F6F7
+U+1F6F8
+U+1F6F9
+U+1F6FA
+U+1F6FB
+U+1F6FC
+U+1F6FD
+U+1F6FE
+U+1F6FF
+U+1F7E0
+U+1F7E1
+U+1F7E2
+U+1F7E3
+U+1F7E4
+U+1F7E5
+U+1F7E6
+U+1F7E7
+U+1F7E8
+U+1F7E9
+U+1F7EA
+U+1F7EB
+U+1F7F0
+U+1F900
+U+1F901
+U+1F902
+U+1F903
+U+1F904
+U+1F905
+U+1F906
+U+1F907
+U+1F908
+U+1F909
+U+1F90A
+U+1F90B
+U+1F90C
+U+1F90D
+U+1F90E
+U+1F90F
+U+1F910
+U+1F911
+U+1F912
+U+1F913
+U+1F914
+U+1F915
+U+1F916
+U+1F917
+U+1F918
+U+1F919
+U+1F91A
+U+1F91B
+U+1F91C
+U+1F91D
+U+1F91E
+U+1F91F
+U+1F920
+U+1F921
+U+1F922
+U+1F923
+U+1F924
+U+1F925
+U+1F926
+U+1F927
+U+1F928
+U+1F929
+U+1F92A
+U+1F92B
+U+1F92C
+U+1F92D
+U+1F92E
+U+1F92F
+U+1F930
+U+1F931
+U+1F932
+U+1F933
+U+1F934
+U+1F935
+U+1F936
+U+1F937
+U+1F938
+U+1F939
+U+1F93A
+U+1F93B
+U+1F93C
+U+1F93D
+U+1F93E
+U+1F93F
+U+1F940
+U+1F941
+U+1F942
+U+1F943
+U+1F944
+U+1F945
+U+1F946
+U+1F947
+U+1F948
+U+1F949
+U+1F94A
+U+1F94B
+U+1F94C
+U+1F94D
+U+1F94E
+U+1F94F
+U+1F950
+U+1F951
+U+1F952
+U+1F953
+U+1F954
+U+1F955
+U+1F956
+U+1F957
+U+1F958
+U+1F959
+U+1F95A
+U+1F95B
+U+1F95C
+U+1F95D
+U+1F95E
+U+1F95F
+U+1F960
+U+1F961
+U+1F962
+U+1F963
+U+1F964
+U+1F965
+U+1F966
+U+1F967
+U+1F968
+U+1F969
+U+1F96A
+U+1F96B
+U+1F96C
+U+1F96D
+U+1F96E
+U+1F96F
+U+1F970
+U+1F971
+U+1F972
+U+1F973
+U+1F974
+U+1F975
+U+1F976
+U+1F977
+U+1F978
+U+1F979
+U+1F97A
+U+1F97B
+U+1F97C
+U+1F97D
+U+1F97E
+U+1F97F
+U+1F980
+U+1F981
+U+1F982
+U+1F983
+U+1F984
+U+1F985
+U+1F986
+U+1F987
+U+1F988
+U+1F989
+U+1F98A
+U+1F98B
+U+1F98C
+U+1F98D
+U+1F98E
+U+1F98F
+U+1F990
+U+1F991
+U+1F992
+U+1F993
+U+1F994
+U+1F995
+U+1F996
+U+1F997
+U+1F998
+U+1F999
+U+1F99A
+U+1F99B
+U+1F99C
+U+1F99D
+U+1F99E
+U+1F99F
+U+1F9A0
+U+1F9A1
+U+1F9A2
+U+1F9A3
+U+1F9A4
+U+1F9A5
+U+1F9A6
+U+1F9A7
+U+1F9A8
+U+1F9A9
+U+1F9AA
+U+1F9AB
+U+1F9AC
+U+1F9AD
+U+1F9AE
+U+1F9AF
+U+1F9B0
+U+1F9B1
+U+1F9B2
+U+1F9B3
+U+1F9B4
+U+1F9B5
+U+1F9B6
+U+1F9B7
+U+1F9B8
+U+1F9B9
+U+1F9BA
+U+1F9BB
+U+1F9BC
+U+1F9BD
+U+1F9BE
+U+1F9BF
+U+1F9C0
+U+1F9C1
+U+1F9C2
+U+1F9C3
+U+1F9C4
+U+1F9C5
+U+1F9C6
+U+1F9C7
+U+1F9C8
+U+1F9C9
+U+1F9CA
+U+1F9CB
+U+1F9CC
+U+1F9CD
+U+1F9CE
+U+1F9CF
+U+1F9D0
+U+1F9D1
+U+1F9D2
+U+1F9D3
+U+1F9D4
+U+1F9D5
+U+1F9D6
+U+1F9D7
+U+1F9D8
+U+1F9D9
+U+1F9DA
+U+1F9DB
+U+1F9DC
+U+1F9DD
+U+1F9DE
+U+1F9DF
+U+1F9E0
+U+1F9E1
+U+1F9E2
+U+1F9E3
+U+1F9E4
+U+1F9E5
+U+1F9E6
+U+1F9E7
+U+1F9E8
+U+1F9E9
+U+1F9EA
+U+1F9EB
+U+1F9EC
+U+1F9ED
+U+1F9EE
+U+1F9EF
+U+1F9F0
+U+1F9F1
+U+1F9F2
+U+1F9F3
+U+1F9F4
+U+1F9F5
+U+1F9F6
+U+1F9F7
+U+1F9F8
+U+1F9F9
+U+1F9FA
+U+1F9FB
+U+1F9FC
+U+1F9FD
+U+1F9FE
+U+1F9FF
+U+1FA70
+U+1FA71
+U+1FA72
+U+1FA73
+U+1FA74
+U+1FA78
+U+1FA79
+U+1FA7A
+U+1FA7B
+U+1FA7C
+U+1FA80
+U+1FA81
+U+1FA82
+U+1FA83
+U+1FA84
+U+1FA85
+U+1FA86
+U+1FA90
+U+1FA91
+U+1FA92
+U+1FA93
+U+1FA94
+U+1FA95
+U+1FA96
+U+1FA97
+U+1FA98
+U+1FA99
+U+1FA9A
+U+1FA9B
+U+1FA9C
+U+1FA9D
+U+1FA9E
+U+1FA9F
+U+1FAA0
+U+1FAA1
+U+1FAA2
+U+1FAA3
+U+1FAA4
+U+1FAA5
+U+1FAA6
+U+1FAA7
+U+1FAA8
+U+1FAA9
+U+1FAAA
+U+1FAAB
+U+1FAAC
+U+1FAB0
+U+1FAB1
+U+1FAB2
+U+1FAB3
+U+1FAB4
+U+1FAB5
+U+1FAB6
+U+1FAB7
+U+1FAB8
+U+1FAB9
+U+1FABA
+U+1FAC0
+U+1FAC1
+U+1FAC2
+U+1FAC3
+U+1FAC4
+U+1FAC5
+U+1FAD0
+U+1FAD1
+U+1FAD2
+U+1FAD3
+U+1FAD4
+U+1FAD5
+U+1FAD6
+U+1FAD7
+U+1FAD8
+U+1FAD9
+U+1FAE0
+U+1FAE1
+U+1FAE2
+U+1FAE3
+U+1FAE4
+U+1FAE5
+U+1FAE6
+U+1FAE7
+U+1FAF0
+U+1FAF1
+U+1FAF2
+U+1FAF3
+U+1FAF4
+U+1FAF5
+U+1FAF6
+U+2048
+U+2049
+U+2122
+U+2139
+U+2190
+U+2191
+U+2192
+U+2193
+U+2194
+U+2195
+U+2196
+U+2197
+U+2198
+U+2199
+U+219A
+U+219B
+U+219C
+U+219D
+U+219E
+U+219F
+U+21A0
+U+21A1
+U+21A2
+U+21A3
+U+21A4
+U+21A5
+U+21A6
+U+21A7
+U+21A8
+U+21A9
+U+21AA
+U+21AB
+U+21AC
+U+21AD
+U+21AE
+U+21AF
+U+21B0
+U+21B1
+U+21B2
+U+21B3
+U+21B4
+U+21B5
+U+21B6
+U+21B7
+U+21B8
+U+21B9
+U+21BA
+U+21BB
+U+21BC
+U+21BD
+U+21BE
+U+21BF
+U+21C0
+U+21C1
+U+21C2
+U+21C3
+U+21C4
+U+21C5
+U+21C6
+U+21C7
+U+21C8
+U+21C9
+U+21CA
+U+21CB
+U+21CC
+U+21CD
+U+21CE
+U+21CF
+U+21D0
+U+21D1
+U+21D2
+U+21D3
+U+21D4
+U+21D5
+U+21D6
+U+21D7
+U+21D8
+U+21D9
+U+21DA
+U+21DB
+U+21DC
+U+21DD
+U+21DE
+U+21DF
+U+21E0
+U+21E1
+U+21E2
+U+21E3
+U+21E4
+U+21E5
+U+21E6
+U+21E7
+U+21E8
+U+21E9
+U+21EA
+U+21EB
+U+21EC
+U+21ED
+U+21EE
+U+21EF
+U+21F0
+U+21F1
+U+21F2
+U+21F3
+U+21F4
+U+21F5
+U+21F6
+U+21F7
+U+21F8
+U+21F9
+U+21FA
+U+21FB
+U+21FC
+U+21FD
+U+21FE
+U+21FF
+U+231A
+U+231B
+U+2328
+U+23CF
+U+23E9
+U+23EA
+U+23EB
+U+23EC
+U+23ED
+U+23EE
+U+23EF
+U+23F0
+U+23F1
+U+23F2
+U+23F3
+U+23F8
+U+23F9
+U+23FA
+U+25AA
+U+25AB
+U+25B6
+U+25C0
+U+25FB
+U+25FC
+U+25FD
+U+25FE
+U+2600
+U+2601
+U+2602
+U+2603
+U+2604
+U+2605
+U+2606
+U+2607
+U+2608
+U+2609
+U+260A
+U+260B
+U+260C
+U+260D
+U+260E
+U+260F
+U+2610
+U+2611
+U+2612
+U+2613
+U+2614
+U+2615
+U+2616
+U+2617
+U+2618
+U+2619
+U+261A
+U+261B
+U+261C
+U+261D
+U+261E
+U+261F
+U+2620
+U+2621
+U+2622
+U+2623
+U+2624
+U+2625
+U+2626
+U+2627
+U+2628
+U+2629
+U+262A
+U+262B
+U+262C
+U+262D
+U+262E
+U+262F
+U+2630
+U+2631
+U+2632
+U+2633
+U+2634
+U+2635
+U+2636
+U+2637
+U+2638
+U+2639
+U+263A
+U+263B
+U+263C
+U+263D
+U+263E
+U+263F
+U+2640
+U+2641
+U+2642
+U+2643
+U+2644
+U+2645
+U+2646
+U+2647
+U+2648
+U+2649
+U+264A
+U+264B
+U+264C
+U+264D
+U+264E
+U+264F
+U+2650
+U+2651
+U+2652
+U+2653
+U+2654
+U+2655
+U+2656
+U+2657
+U+2658
+U+2659
+U+265A
+U+265B
+U+265C
+U+265D
+U+265E
+U+265F
+U+2660
+U+2661
+U+2662
+U+2663
+U+2664
+U+2665
+U+2666
+U+2667
+U+2668
+U+2669
+U+266A
+U+266B
+U+266C
+U+266D
+U+266E
+U+266F
+U+2670
+U+2671
+U+2672
+U+2673
+U+2674
+U+2675
+U+2676
+U+2677
+U+2678
+U+2679
+U+267A
+U+267B
+U+267C
+U+267D
+U+267E
+U+267F
+U+2680
+U+2681
+U+2682
+U+2683
+U+2684
+U+2685
+U+2686
+U+2687
+U+2688
+U+2689
+U+268A
+U+268B
+U+268C
+U+268D
+U+268E
+U+268F
+U+2690
+U+2691
+U+2692
+U+2693
+U+2694
+U+2695
+U+2696
+U+2697
+U+2698
+U+2699
+U+269A
+U+269B
+U+269C
+U+269D
+U+269E
+U+269F
+U+26A0
+U+26A1
+U+26A2
+U+26A3
+U+26A4
+U+26A5
+U+26A6
+U+26A7
+U+26A8
+U+26A9
+U+26AA
+U+26AB
+U+26AC
+U+26AD
+U+26AE
+U+26AF
+U+26B0
+U+26B1
+U+26B2
+U+26B3
+U+26B4
+U+26B5
+U+26B6
+U+26B7
+U+26B8
+U+26B9
+U+26BA
+U+26BB
+U+26BC
+U+26BD
+U+26BE
+U+26BF
+U+26C0
+U+26C1
+U+26C2
+U+26C3
+U+26C4
+U+26C5
+U+26C6
+U+26C7
+U+26C8
+U+26C9
+U+26CA
+U+26CB
+U+26CC
+U+26CD
+U+26CE
+U+26CF
+U+26D0
+U+26D1
+U+26D2
+U+26D3
+U+26D4
+U+26D5
+U+26D6
+U+26D7
+U+26D8
+U+26D9
+U+26DA
+U+26DB
+U+26DC
+U+26DD
+U+26DE
+U+26DF
+U+26E0
+U+26E1
+U+26E2
+U+26E3
+U+26E4
+U+26E5
+U+26E6
+U+26E7
+U+26E8
+U+26E9
+U+26EA
+U+26EB
+U+26EC
+U+26ED
+U+26EE
+U+26EF
+U+26F0
+U+26F1
+U+26F2
+U+26F3
+U+26F4
+U+26F5
+U+26F6
+U+26F7
+U+26F8
+U+26F9
+U+26FA
+U+26FB
+U+26FC
+U+26FD
+U+26FE
+U+26FF
+U+2700
+U+2701
+U+2702
+U+2703
+U+2704
+U+2705
+U+2706
+U+2707
+U+2708
+U+2709
+U+270A
+U+270B
+U+270C
+U+270D
+U+270E
+U+270F
+U+2710
+U+2711
+U+2712
+U+2713
+U+2714
+U+2715
+U+2716
+U+2717
+U+2718
+U+2719
+U+271A
+U+271B
+U+271C
+U+271D
+U+271E
+U+271F
+U+2720
+U+2721
+U+2722
+U+2723
+U+2724
+U+2725
+U+2726
+U+2727
+U+2728
+U+2729
+U+272A
+U+272B
+U+272C
+U+272D
+U+272E
+U+272F
+U+2730
+U+2731
+U+2732
+U+2733
+U+2734
+U+2735
+U+2736
+U+2737
+U+2738
+U+2739
+U+273A
+U+273B
+U+273C
+U+273D
+U+273E
+U+273F
+U+2740
+U+2741
+U+2742
+U+2743
+U+2744
+U+2745
+U+2746
+U+2747
+U+2748
+U+2749
+U+274A
+U+274B
+U+274C
+U+274D
+U+274E
+U+274F
+U+2750
+U+2751
+U+2752
+U+2753
+U+2754
+U+2755
+U+2756
+U+2757
+U+2758
+U+2759
+U+275A
+U+275B
+U+275C
+U+275D
+U+275E
+U+275F
+U+2760
+U+2761
+U+2762
+U+2763
+U+2764
+U+2765
+U+2766
+U+2767
+U+2768
+U+2769
+U+276A
+U+276B
+U+276C
+U+276D
+U+276E
+U+276F
+U+2770
+U+2771
+U+2772
+U+2773
+U+2774
+U+2775
+U+2776
+U+2777
+U+2778
+U+2779
+U+277A
+U+277B
+U+277C
+U+277D
+U+277E
+U+277F
+U+2780
+U+2781
+U+2782
+U+2783
+U+2784
+U+2785
+U+2786
+U+2787
+U+2788
+U+2789
+U+278A
+U+278B
+U+278C
+U+278D
+U+278E
+U+278F
+U+2790
+U+2791
+U+2792
+U+2793
+U+2794
+U+2795
+U+2796
+U+2797
+U+2798
+U+2799
+U+279A
+U+279B
+U+279C
+U+279D
+U+279E
+U+279F
+U+27A0
+U+27A1
+U+27A2
+U+27A3
+U+27A4
+U+27A5
+U+27A6
+U+27A7
+U+27A8
+U+27A9
+U+27AA
+U+27AB
+U+27AC
+U+27AD
+U+27AE
+U+27AF
+U+27B0
+U+27B1
+U+27B2
+U+27B3
+U+27B4
+U+27B5
+U+27B6
+U+27B7
+U+27B8
+U+27B9
+U+27BA
+U+27BB
+U+27BC
+U+27BD
+U+27BE
+U+27BF
+U+2934
+U+2935
+U+2B05
+U+2B06
+U+2B07
+U+2B1B
+U+2B1C
+U+2B50
+U+2B55
+U+3030
+U+303D
+U+3297
+U+3299
index 51b215d46b2d401080c8e840cc4f454d78124b32..3205e9327a4056ec30213f8230fe75c38353315b 100644 (file)
@@ -4,6 +4,41 @@
 extern "C" {
 #endif
 
+FILE *data__bytesequence_file_open__alphabetic(void) {
+
+  return fopen("./data/tests/bytesequences/alphabetic-all.txt", "r");
+}
+
+FILE *data__bytesequence_file_open__combining(void) {
+
+  return fopen("./data/tests/bytesequences/combining-all.txt", "r");
+}
+
+FILE *data__bytesequence_file_open__control(void) {
+
+  return fopen("./data/tests/bytesequences/control-all.txt", "r");
+}
+
+FILE *data__bytesequence_file_open__digit(void) {
+
+  return fopen("./data/tests/bytesequences/digit-all.txt", "r");
+}
+
+FILE *data__bytesequence_file_open__emoji(void) {
+
+  return fopen("./data/tests/bytesequences/emoji-all.txt", "r");
+}
+
+FILE *data__bytesequence_file_open__numeric(void) {
+
+  return fopen("./data/tests/bytesequences/numeric-all.txt", "r");
+}
+
+FILE *data__bytesequence_file_open__phonetic(void) {
+
+  return fopen("./data/tests/bytesequences/phonetic-all.txt", "r");
+}
+
 FILE *data__bytesequence_file_open__private(void) {
 
   return fopen("./data/tests/bytesequences/private-all.txt", "r");
@@ -14,9 +49,49 @@ FILE *data__bytesequence_file_open__punctuation(void) {
   return fopen("./data/tests/bytesequences/punctuation-all.txt", "r");
 }
 
-FILE *data__bytesequence_file_open__symbols(void) {
+FILE *data__bytesequence_file_open__subscript(void) {
+
+  return fopen("./data/tests/bytesequences/subscript-all.txt", "r");
+}
+
+FILE *data__bytesequence_file_open__superscript(void) {
+
+  return fopen("./data/tests/bytesequences/superscript-all.txt", "r");
+}
+
+FILE *data__bytesequence_file_open__surrogate(void) {
+
+  return fopen("./data/tests/bytesequences/superscript-surrogate.txt", "r");
+}
+
+FILE *data__bytesequence_file_open__symbol(void) {
+
+  return fopen("./data/tests/bytesequences/symbol-all.txt", "r");
+}
+
+FILE *data__bytesequence_file_open__valid(void) {
+
+  return fopen("./data/tests/bytesequences/valid-all.txt", "r");
+}
+
+FILE *data__bytesequence_file_open__whitespace(void) {
+
+  return fopen("./data/tests/bytesequences/whitespace-all.txt", "r");
+}
+
+FILE *data__bytesequence_file_open__wide(void) {
+
+  return fopen("./data/tests/bytesequences/wide-all.txt", "r");
+}
+
+FILE *data__bytesequence_file_open__word(void) {
+
+  return fopen("./data/tests/bytesequences/word-all.txt", "r");
+}
+
+FILE *data__bytesequence_file_open__zero_width(void) {
 
-  return fopen("./data/tests/bytesequences/symbols-all.txt", "r");
+  return fopen("./data/tests/bytesequences/zero_width-all.txt", "r");
 }
 
 uint8_t data__bytesequence_get_line(FILE * const file, f_utf_char_t * const character) {
index 411ef936631ebba457b71cc6cfd756e9e4421eb7..9b1b1859e7310f7be6010042eb3398a332ce1a32 100644 (file)
@@ -23,6 +23,111 @@ extern "C" {
 #endif
 
 /**
+ * Open the "alphabetic" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/alphabetic-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__alphabetic(void);
+
+/**
+ * Open the "combining" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/combining-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__combining(void);
+
+/**
+ * Open the "control" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/control-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__control(void);
+
+/**
+ * Open the "digit" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/digit-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__digit(void);
+
+/**
+ * Open the "emoji" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/emoji-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__emoji(void);
+
+/**
+ * Open the "numeric" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/numeric-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__numeric(void);
+
+/**
+ * Open the "phonetic" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/phonetic-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__phonetic(void);
+
+/**
  * Open the "private use area" bytesequence file.
  *
  * This assumes the following:
@@ -53,11 +158,131 @@ extern FILE *data__bytesequence_file_open__private(void);
 extern FILE *data__bytesequence_file_open__punctuation(void);
 
 /**
+ * Open the "subscript" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/subscript-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__subscript(void);
+
+/**
+ * Open the "superscript" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/superscript-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__superscript(void);
+
+/**
+ * Open the "surrogate" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/surrogate-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__surrogate(void);
+
+/**
  * Open the "symbols" bytesequence file.
  *
  * This assumes the following:
  * - The file path is relative to the current working directory (tests are run from project root).
- * - The file path is "data/tests/bytesequences/symbols-all.txt".
+ * - The file path is "data/tests/bytesequences/symbol-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__symbol(void);
+
+/**
+ * Open the "valid" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/valid-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__valid(void);
+
+/**
+ * Open the "whitespace" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/whitespace-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__whitespace(void);
+
+/**
+ * Open the "wide" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/wide-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__wide(void);
+
+/**
+ * Open the "word" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/word-all.txt".
+ *
+ * @return
+ *   Non-zero on success.
+ *   0 on failure.
+ *
+ * @see fopen()
+ */
+extern FILE *data__bytesequence_file_open__word(void);
+
+/**
+ * Open the "zero_width" bytesequence file.
+ *
+ * This assumes the following:
+ * - The file path is relative to the current working directory (tests are run from project root).
+ * - The file path is "data/tests/bytesequences/zero_width-all.txt".
  *
  * @return
  *   Non-zero on success.
@@ -65,7 +290,7 @@ extern FILE *data__bytesequence_file_open__punctuation(void);
  *
  * @see fopen()
  */
-extern FILE *data__bytesequence_file_open__symbols(void);
+extern FILE *data__bytesequence_file_open__zero_width(void);
 
 /**
  * Simple line reader that converts the line into a character.
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_alphabetic.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_alphabetic.c
new file mode 100644 (file)
index 0000000..5e6751b
--- /dev/null
@@ -0,0 +1,39 @@
+#include "test-utf.h"
+#include "test-utf-character_is_alphabetic.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_alphabetic__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__alphabetic();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_alphabetic(character);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_alphabetic.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_alphabetic.h
new file mode 100644 (file)
index 0000000..1a56603
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_alphabetic_h
+#define _TEST__F_utf_character_is_alphabetic_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_character_is_alphabetic()
+ */
+extern void test__f_utf_character_is_alphabetic__works(void **state);
+
+#endif // _TEST__F_utf_character_is_alphabetic_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_combining.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_combining.c
new file mode 100644 (file)
index 0000000..1312e6f
--- /dev/null
@@ -0,0 +1,39 @@
+#include "test-utf.h"
+#include "test-utf-character_is_combining.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_combining__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__combining();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_combining(character);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_combining.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_combining.h
new file mode 100644 (file)
index 0000000..30fa69d
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_combining_h
+#define _TEST__F_utf_character_is_combining_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_character_is_combining()
+ */
+extern void test__f_utf_character_is_combining__works(void **state);
+
+#endif // _TEST__F_utf_character_is_combining_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_control.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_control.c
new file mode 100644 (file)
index 0000000..e40e1aa
--- /dev/null
@@ -0,0 +1,39 @@
+#include "test-utf.h"
+#include "test-utf-character_is_control.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_control__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__control();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_control(character);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_control.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_control.h
new file mode 100644 (file)
index 0000000..7e1e5f2
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_control_h
+#define _TEST__F_utf_character_is_control_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_character_is_control()
+ */
+extern void test__f_utf_character_is_control__works(void **state);
+
+#endif // _TEST__F_utf_character_is_control_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_digit.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_digit.c
new file mode 100644 (file)
index 0000000..507bb32
--- /dev/null
@@ -0,0 +1,39 @@
+#include "test-utf.h"
+#include "test-utf-character_is_digit.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_digit__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__digit();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_digit(character);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_digit.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_digit.h
new file mode 100644 (file)
index 0000000..b78b070
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_digit_h
+#define _TEST__F_utf_character_is_digit_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_character_is_digit()
+ */
+extern void test__f_utf_character_is_digit__works(void **state);
+
+#endif // _TEST__F_utf_character_is_digit_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_emoji.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_emoji.c
new file mode 100644 (file)
index 0000000..1ddbe2a
--- /dev/null
@@ -0,0 +1,39 @@
+#include "test-utf.h"
+#include "test-utf-character_is_emoji.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_emoji__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__emoji();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_emoji(character);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_emoji.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_emoji.h
new file mode 100644 (file)
index 0000000..e33dc0f
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_emoji_h
+#define _TEST__F_utf_character_is_emoji_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_character_is_emoji()
+ */
+extern void test__f_utf_character_is_emoji__works(void **state);
+
+#endif // _TEST__F_utf_character_is_emoji_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_numeric.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_numeric.c
new file mode 100644 (file)
index 0000000..dce0932
--- /dev/null
@@ -0,0 +1,39 @@
+#include "test-utf.h"
+#include "test-utf-character_is_numeric.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_numeric__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__numeric();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_numeric(character);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_numeric.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_numeric.h
new file mode 100644 (file)
index 0000000..5d94295
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_numeric_h
+#define _TEST__F_utf_character_is_numeric_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_character_is_numeric()
+ */
+extern void test__f_utf_character_is_numeric__works(void **state);
+
+#endif // _TEST__F_utf_character_is_numeric_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_phonetic.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_phonetic.c
new file mode 100644 (file)
index 0000000..6c2724c
--- /dev/null
@@ -0,0 +1,39 @@
+#include "test-utf.h"
+#include "test-utf-character_is_phonetic.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_phonetic__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__phonetic();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_phonetic(character);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_phonetic.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_phonetic.h
new file mode 100644 (file)
index 0000000..1fda9eb
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_phonetic_h
+#define _TEST__F_utf_character_is_phonetic_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_character_is_phonetic()
+ */
+extern void test__f_utf_character_is_phonetic__works(void **state);
+
+#endif // _TEST__F_utf_character_is_phonetic_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_subscript.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_subscript.c
new file mode 100644 (file)
index 0000000..7fe409b
--- /dev/null
@@ -0,0 +1,39 @@
+#include "test-utf.h"
+#include "test-utf-character_is_subscript.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_subscript__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__subscript();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_subscript(character);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_subscript.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_subscript.h
new file mode 100644 (file)
index 0000000..0ea1b9a
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_subscript_h
+#define _TEST__F_utf_character_is_subscript_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_character_is_subscript()
+ */
+extern void test__f_utf_character_is_subscript__works(void **state);
+
+#endif // _TEST__F_utf_character_is_subscript_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_superscript.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_superscript.c
new file mode 100644 (file)
index 0000000..0757a47
--- /dev/null
@@ -0,0 +1,39 @@
+#include "test-utf.h"
+#include "test-utf-character_is_superscript.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_superscript__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__superscript();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_superscript(character);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_superscript.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_superscript.h
new file mode 100644 (file)
index 0000000..a15a4bf
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_superscript_h
+#define _TEST__F_utf_character_is_superscript_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_character_is_superscript()
+ */
+extern void test__f_utf_character_is_superscript__works(void **state);
+
+#endif // _TEST__F_utf_character_is_superscript_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_surrogate.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_surrogate.c
new file mode 100644 (file)
index 0000000..8a8d6a7
--- /dev/null
@@ -0,0 +1,39 @@
+#include "test-utf.h"
+#include "test-utf-character_is_surrogate.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_surrogate__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__surrogate();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_surrogate(character);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_surrogate.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_surrogate.h
new file mode 100644 (file)
index 0000000..b26f110
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_surrogate_h
+#define _TEST__F_utf_character_is_surrogate_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_character_is_surrogate()
+ */
+extern void test__f_utf_character_is_surrogate__works(void **state);
+
+#endif // _TEST__F_utf_character_is_surrogate_h
index 75db13661c52c265c02276fe937c2a6b49eff989..9eccad632f3778e9d35702c3dd78b974ebb27787 100644 (file)
@@ -8,7 +8,7 @@ extern "C" {
 void test__f_utf_character_is_symbol__works(void **state) {
 
   {
-    FILE *file = data__bytesequence_file_open__symbols();
+    FILE *file = data__bytesequence_file_open__symbol();
 
     assert_non_null(file);
 
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_valid.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_valid.c
new file mode 100644 (file)
index 0000000..b2b426f
--- /dev/null
@@ -0,0 +1,69 @@
+#include "test-utf.h"
+#include "test-utf-character_is_valid.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_valid__works(void **state) {
+
+  for (uint32_t character = 0; character < UINT32_MAX; ++character) {
+
+    const uint8_t first = macro_f_utf_char_t_to_char_1(character);
+    const uint8_t second = macro_f_utf_char_t_to_char_2(character);
+    const uint8_t third = macro_f_utf_char_t_to_char_3(character);
+    const uint8_t fourth = macro_f_utf_char_t_to_char_4(character);
+
+    const f_status_t status = f_utf_character_is_valid(character);
+
+    // Valid: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx.
+    if ((first & 0b11111000) == 0b11111000) {
+      assert_false(status);
+    }
+    else if ((first & 0b11111000) == 0b11110000) {
+      if ((second & 0b11000000) == 0b10000000 && (third & 0b11000000) == 0b10000000 && (fourth & 0b11000000) == 0b10000000) {
+        assert_true(status);
+      }
+      else {
+        assert_false(status);
+      }
+    }
+
+    // Valid: 1110xxxx 10xxxxxx 10xxxxxx 00000000.
+    else if ((first & 0b11110000) == 0b11100000) {
+      if ((second & 0b11000000) == 0b10000000 && (third & 0b11000000) == 0b10000000) {
+        assert_true(status);
+      }
+      else {
+        assert_false(status);
+      }
+    }
+
+    // Valid: 110xxxxx 10xxxxxx 00000000 00000000.
+    else if ((first & 0b11100000) == 0b11000000) {
+      if ((second & 0b11000000) == 0b10000000) {
+        assert_true(status);
+      }
+      else {
+        assert_false(status);
+      }
+    }
+
+    // Invalid (UTF Fragment): 10xxxxxx 00000000 00000000 00000000.
+    else if ((first & 0b11000000) == 0b10000000) {
+      assert_int_equal(status, F_status_set_error(F_utf_fragment));
+    }
+
+    // Valid: 0xxxxxxx 00000000 00000000 00000000.
+    else if (!(first & 0b10000000)) {
+      assert_true(status);
+    }
+    else {
+      assert_false(status);
+    }
+  } // for
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_valid.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_valid.h
new file mode 100644 (file)
index 0000000..6e0c49c
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_valid_h
+#define _TEST__F_utf_character_is_valid_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_character_is_valid()
+ */
+extern void test__f_utf_character_is_valid__works(void **state);
+
+#endif // _TEST__F_utf_character_is_valid_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_whitespace.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_whitespace.c
new file mode 100644 (file)
index 0000000..8df3e02
--- /dev/null
@@ -0,0 +1,39 @@
+#include "test-utf.h"
+#include "test-utf-character_is_whitespace.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_whitespace__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__whitespace();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_whitespace(character);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_whitespace.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_whitespace.h
new file mode 100644 (file)
index 0000000..4b51aa9
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_whitespace_h
+#define _TEST__F_utf_character_is_whitespace_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_character_is_whitespace()
+ */
+extern void test__f_utf_character_is_whitespace__works(void **state);
+
+#endif // _TEST__F_utf_character_is_whitespace_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_wide.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_wide.c
new file mode 100644 (file)
index 0000000..aa06c90
--- /dev/null
@@ -0,0 +1,39 @@
+#include "test-utf.h"
+#include "test-utf-character_is_wide.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_wide__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__wide();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_wide(character);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_wide.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_wide.h
new file mode 100644 (file)
index 0000000..0983925
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_wide_h
+#define _TEST__F_utf_character_is_wide_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_character_is_wide()
+ */
+extern void test__f_utf_character_is_wide__works(void **state);
+
+#endif // _TEST__F_utf_character_is_wide_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_word.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_word.c
new file mode 100644 (file)
index 0000000..3b07e18
--- /dev/null
@@ -0,0 +1,69 @@
+#include "test-utf.h"
+#include "test-utf-character_is_word.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_word__strict_is_false(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__word();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_word(character, F_false);
+
+        // @todo provide an array of codes that should return false when not strict.
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+void test__f_utf_character_is_word__strict_is_true(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__word();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_word(character, F_true);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_word.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_word.h
new file mode 100644 (file)
index 0000000..c4be62a
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_word_h
+#define _TEST__F_utf_character_is_word_h
+
+/**
+ * Test that the function works when strict is F_false.
+ *
+ * @see f_utf_character_is_word()
+ */
+extern void test__f_utf_character_is_word__strict_is_false(void **state);
+
+/**
+ * Test that the function works when strict is F_true.
+ *
+ * @see f_utf_character_is_word()
+ */
+extern void test__f_utf_character_is_word__strict_is_true(void **state);
+
+#endif // _TEST__F_utf_character_is_word_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_zero_width.c b/level_0/f_utf/tests/unit/c/test-utf-character_is_zero_width.c
new file mode 100644 (file)
index 0000000..11c477a
--- /dev/null
@@ -0,0 +1,39 @@
+#include "test-utf.h"
+#include "test-utf-character_is_zero_width.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_character_is_zero_width__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__zero_width();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const f_status_t status = f_utf_character_is_zero_width(character);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-character_is_zero_width.h b/level_0/f_utf/tests/unit/c/test-utf-character_is_zero_width.h
new file mode 100644 (file)
index 0000000..b54bb1c
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_character_is_zero_width_h
+#define _TEST__F_utf_character_is_zero_width_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_character_is_zero_width()
+ */
+extern void test__f_utf_character_is_zero_width__works(void **state);
+
+#endif // _TEST__F_utf_character_is_zero_width_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_alphabetic.c b/level_0/f_utf/tests/unit/c/test-utf-is_alphabetic.c
new file mode 100644 (file)
index 0000000..656be86
--- /dev/null
@@ -0,0 +1,56 @@
+#include "test-utf.h"
+#include "test-utf-is_alphabetic.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_alphabetic__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__alphabetic();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_alphabetic(buffer, 5);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_alphabetic.h b/level_0/f_utf/tests/unit/c/test-utf-is_alphabetic.h
new file mode 100644 (file)
index 0000000..5c86107
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_alphabetic_h
+#define _TEST__F_utf_is_alphabetic_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_is_alphabetic()
+ */
+extern void test__f_utf_is_alphabetic__works(void **state);
+
+#endif // _TEST__F_utf_is_alphabetic_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_combining.c b/level_0/f_utf/tests/unit/c/test-utf-is_combining.c
new file mode 100644 (file)
index 0000000..180b2bf
--- /dev/null
@@ -0,0 +1,56 @@
+#include "test-utf.h"
+#include "test-utf-is_combining.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_combining__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__combining();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_combining(buffer, 5);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_combining.h b/level_0/f_utf/tests/unit/c/test-utf-is_combining.h
new file mode 100644 (file)
index 0000000..5aded71
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_combining_h
+#define _TEST__F_utf_is_combining_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_is_combining()
+ */
+extern void test__f_utf_is_combining__works(void **state);
+
+#endif // _TEST__F_utf_is_combining_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_control.c b/level_0/f_utf/tests/unit/c/test-utf-is_control.c
new file mode 100644 (file)
index 0000000..fbdb61b
--- /dev/null
@@ -0,0 +1,56 @@
+#include "test-utf.h"
+#include "test-utf-is_control.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_control__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__control();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_control(buffer, 5);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_control.h b/level_0/f_utf/tests/unit/c/test-utf-is_control.h
new file mode 100644 (file)
index 0000000..bac83d7
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_control_h
+#define _TEST__F_utf_is_control_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_is_control()
+ */
+extern void test__f_utf_is_control__works(void **state);
+
+#endif // _TEST__F_utf_is_control_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_digit.c b/level_0/f_utf/tests/unit/c/test-utf-is_digit.c
new file mode 100644 (file)
index 0000000..fb3a48f
--- /dev/null
@@ -0,0 +1,56 @@
+#include "test-utf.h"
+#include "test-utf-is_digit.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_digit__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__digit();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_digit(buffer, 5);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_digit.h b/level_0/f_utf/tests/unit/c/test-utf-is_digit.h
new file mode 100644 (file)
index 0000000..fc048cb
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_digit_h
+#define _TEST__F_utf_is_digit_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_is_digit()
+ */
+extern void test__f_utf_is_digit__works(void **state);
+
+#endif // _TEST__F_utf_is_digit_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_emoji.c b/level_0/f_utf/tests/unit/c/test-utf-is_emoji.c
new file mode 100644 (file)
index 0000000..a2d26f3
--- /dev/null
@@ -0,0 +1,56 @@
+#include "test-utf.h"
+#include "test-utf-is_emoji.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_emoji__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__emoji();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_emoji(buffer, 5);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_emoji.h b/level_0/f_utf/tests/unit/c/test-utf-is_emoji.h
new file mode 100644 (file)
index 0000000..4ad259d
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_emoji_h
+#define _TEST__F_utf_is_emoji_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_is_emoji()
+ */
+extern void test__f_utf_is_emoji__works(void **state);
+
+#endif // _TEST__F_utf_is_emoji_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_numeric.c b/level_0/f_utf/tests/unit/c/test-utf-is_numeric.c
new file mode 100644 (file)
index 0000000..e0bd4dc
--- /dev/null
@@ -0,0 +1,56 @@
+#include "test-utf.h"
+#include "test-utf-is_numeric.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_numeric__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__numeric();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_numeric(buffer, 5);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_numeric.h b/level_0/f_utf/tests/unit/c/test-utf-is_numeric.h
new file mode 100644 (file)
index 0000000..769f454
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_numeric_h
+#define _TEST__F_utf_is_numeric_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_is_numeric()
+ */
+extern void test__f_utf_is_numeric__works(void **state);
+
+#endif // _TEST__F_utf_is_numeric_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_phonetic.c b/level_0/f_utf/tests/unit/c/test-utf-is_phonetic.c
new file mode 100644 (file)
index 0000000..e3bd806
--- /dev/null
@@ -0,0 +1,56 @@
+#include "test-utf.h"
+#include "test-utf-is_phonetic.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_phonetic__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__phonetic();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_phonetic(buffer, 5);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_phonetic.h b/level_0/f_utf/tests/unit/c/test-utf-is_phonetic.h
new file mode 100644 (file)
index 0000000..7aff26e
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_phonetic_h
+#define _TEST__F_utf_is_phonetic_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_is_phonetic()
+ */
+extern void test__f_utf_is_phonetic__works(void **state);
+
+#endif // _TEST__F_utf_is_phonetic_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_subscript.c b/level_0/f_utf/tests/unit/c/test-utf-is_subscript.c
new file mode 100644 (file)
index 0000000..0bf3ac1
--- /dev/null
@@ -0,0 +1,56 @@
+#include "test-utf.h"
+#include "test-utf-is_subscript.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_subscript__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__subscript();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_subscript(buffer, 5);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_subscript.h b/level_0/f_utf/tests/unit/c/test-utf-is_subscript.h
new file mode 100644 (file)
index 0000000..1dcc89d
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_subscript_h
+#define _TEST__F_utf_is_subscript_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_is_subscript()
+ */
+extern void test__f_utf_is_subscript__works(void **state);
+
+#endif // _TEST__F_utf_is_subscript_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_superscript.c b/level_0/f_utf/tests/unit/c/test-utf-is_superscript.c
new file mode 100644 (file)
index 0000000..1c7e418
--- /dev/null
@@ -0,0 +1,56 @@
+#include "test-utf.h"
+#include "test-utf-is_superscript.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_superscript__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__superscript();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_superscript(buffer, 5);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_superscript.h b/level_0/f_utf/tests/unit/c/test-utf-is_superscript.h
new file mode 100644 (file)
index 0000000..5cdf8eb
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_superscript_h
+#define _TEST__F_utf_is_superscript_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_is_superscript()
+ */
+extern void test__f_utf_is_superscript__works(void **state);
+
+#endif // _TEST__F_utf_is_superscript_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_surrogate.c b/level_0/f_utf/tests/unit/c/test-utf-is_surrogate.c
new file mode 100644 (file)
index 0000000..4807e12
--- /dev/null
@@ -0,0 +1,56 @@
+#include "test-utf.h"
+#include "test-utf-is_surrogate.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_surrogate__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__surrogate();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_surrogate(buffer, 5);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_surrogate.h b/level_0/f_utf/tests/unit/c/test-utf-is_surrogate.h
new file mode 100644 (file)
index 0000000..9e40807
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_surrogate_h
+#define _TEST__F_utf_is_surrogate_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_is_surrogate()
+ */
+extern void test__f_utf_is_surrogate__works(void **state);
+
+#endif // _TEST__F_utf_is_surrogate_h
index 509198cf9d60a8a5bcfe535b7b0f3aa0fe0c9222..e4dd67422e82395245de09a89ab240ebe2a2ab39 100644 (file)
@@ -8,7 +8,7 @@ extern "C" {
 void test__f_utf_is_symbol__works(void **state) {
 
   {
-    FILE *file = data__bytesequence_file_open__symbols();
+    FILE *file = data__bytesequence_file_open__symbol();
 
     assert_non_null(file);
 
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_valid.c b/level_0/f_utf/tests/unit/c/test-utf-is_valid.c
new file mode 100644 (file)
index 0000000..9e12eec
--- /dev/null
@@ -0,0 +1,72 @@
+#include "test-utf.h"
+#include "test-utf-is_valid.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_valid__works(void **state) {
+
+  for (uint32_t character = 0; character < UINT32_MAX; ++character) {
+
+    const uint8_t first = macro_f_utf_char_t_to_char_1(character);
+    const uint8_t second = macro_f_utf_char_t_to_char_2(character);
+    const uint8_t third = macro_f_utf_char_t_to_char_3(character);
+    const uint8_t fourth = macro_f_utf_char_t_to_char_4(character);
+
+    char buffer[5] = { first, second, third, fourth, 0 };
+
+    // This function only checks validity based on width and does not look at unknown data.
+    const f_status_t status = f_utf_is_valid(buffer, 5);
+
+    // Valid: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx.
+    if ((first & 0b11111000) == 0b11111000) {
+      assert_false(status);
+    }
+    else if ((first & 0b11111000) == 0b11110000) {
+      if ((second & 0b11000000) == 0b10000000 && (third & 0b11000000) == 0b10000000 && (fourth & 0b11000000) == 0b10000000) {
+        assert_true(status);
+      }
+      else {
+        assert_false(status);
+      }
+    }
+
+    // Valid: 1110xxxx 10xxxxxx 10xxxxxx 00000000.
+    else if ((first & 0b11110000) == 0b11100000) {
+      if ((second & 0b11000000) == 0b10000000 && (third & 0b11000000) == 0b10000000) {
+        assert_true(status);
+      }
+      else {
+        assert_false(status);
+      }
+    }
+
+    // Valid: 110xxxxx 10xxxxxx 00000000 00000000.
+    else if ((first & 0b11100000) == 0b11000000) {
+      if ((second & 0b11000000) == 0b10000000) {
+        assert_true(status);
+      }
+      else {
+        assert_false(status);
+      }
+    }
+
+    // Invalid (UTF Fragment): 10xxxxxx 00000000 00000000 00000000.
+    else if ((first & 0b11000000) == 0b10000000) {
+      assert_int_equal(status, F_status_set_error(F_utf_fragment));
+    }
+
+    // Valid: 0xxxxxxx 00000000 00000000 00000000.
+    else if (!(first & 0b10000000)) {
+      assert_true(status);
+    }
+    else {
+      assert_false(status);
+    }
+  } // for
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_valid.h b/level_0/f_utf/tests/unit/c/test-utf-is_valid.h
new file mode 100644 (file)
index 0000000..b8ae5e0
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_valid_h
+#define _TEST__F_utf_is_valid_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_is_valid()
+ */
+extern void test__f_utf_is_valid__works(void **state);
+
+#endif // _TEST__F_utf_is_valid_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_whitespace.c b/level_0/f_utf/tests/unit/c/test-utf-is_whitespace.c
new file mode 100644 (file)
index 0000000..5b4dc30
--- /dev/null
@@ -0,0 +1,56 @@
+#include "test-utf.h"
+#include "test-utf-is_whitespace.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_whitespace__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__whitespace();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_whitespace(buffer, 5);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_whitespace.h b/level_0/f_utf/tests/unit/c/test-utf-is_whitespace.h
new file mode 100644 (file)
index 0000000..a966d4b
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_whitespace_h
+#define _TEST__F_utf_is_whitespace_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_is_whitespace()
+ */
+extern void test__f_utf_is_whitespace__works(void **state);
+
+#endif // _TEST__F_utf_is_whitespace_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_wide.c b/level_0/f_utf/tests/unit/c/test-utf-is_wide.c
new file mode 100644 (file)
index 0000000..f9882ef
--- /dev/null
@@ -0,0 +1,56 @@
+#include "test-utf.h"
+#include "test-utf-is_wide.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_wide__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__wide();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_wide(buffer, 5);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_wide.h b/level_0/f_utf/tests/unit/c/test-utf-is_wide.h
new file mode 100644 (file)
index 0000000..542d1c2
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_wide_h
+#define _TEST__F_utf_is_wide_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_is_wide()
+ */
+extern void test__f_utf_is_wide__works(void **state);
+
+#endif // _TEST__F_utf_is_wide_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_word.c b/level_0/f_utf/tests/unit/c/test-utf-is_word.c
new file mode 100644 (file)
index 0000000..b572408
--- /dev/null
@@ -0,0 +1,103 @@
+#include "test-utf.h"
+#include "test-utf-is_word.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_word__strict_is_false(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__word();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_word(buffer, F_false, 5);
+
+        // @todo provide an array of codes that should return false when not strict.
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+void test__f_utf_is_word__strict_is_true(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__word();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_word(buffer, F_true, 5);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_word.h b/level_0/f_utf/tests/unit/c/test-utf-is_word.h
new file mode 100644 (file)
index 0000000..7a838b6
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_word_h
+#define _TEST__F_utf_is_word_h
+
+/**
+ * Test that the function works when strict is F_false.
+ *
+ * @see f_utf_is_word()
+ */
+extern void test__f_utf_is_word__strict_is_false(void **state);
+
+/**
+ * Test that the function works when strict is F_true.
+ *
+ * @see f_utf_is_word()
+ */
+extern void test__f_utf_is_word__strict_is_true(void **state);
+
+#endif // _TEST__F_utf_is_word_h
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_zero_width.c b/level_0/f_utf/tests/unit/c/test-utf-is_zero_width.c
new file mode 100644 (file)
index 0000000..6087717
--- /dev/null
@@ -0,0 +1,56 @@
+#include "test-utf.h"
+#include "test-utf-is_zero_width.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_utf_is_zero_width__works(void **state) {
+
+  {
+    FILE *file = data__bytesequence_file_open__zero_width();
+
+    assert_non_null(file);
+
+    f_utf_char_t character = 0;
+    int8_t bytes = 0;
+
+    f_array_length_t line = 0;
+
+    do {
+      bytes = data__bytesequence_get_line(file, &character);
+
+      if (bytes) {
+        const uint8_t width = macro_f_utf_char_t_width(character);
+        char buffer[5] = { 0, 0, 0, 0, 0 };
+
+        buffer[0] = macro_f_utf_char_t_to_char_1(character);
+
+        if (width > 1) {
+          buffer[1] = macro_f_utf_char_t_to_char_2(character);
+
+          if (width > 2) {
+            buffer[2] = macro_f_utf_char_t_to_char_3(character);
+
+            if (width > 3) {
+              buffer[3] = macro_f_utf_char_t_to_char_4(character);
+            }
+          }
+        }
+
+        const f_status_t status = f_utf_is_zero_width(buffer, 5);
+
+        assert_true(status);
+      }
+
+      ++line;
+
+    } while (bytes > 0);
+
+    fclose(file);
+  }
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/level_0/f_utf/tests/unit/c/test-utf-is_zero_width.h b/level_0/f_utf/tests/unit/c/test-utf-is_zero_width.h
new file mode 100644 (file)
index 0000000..5528226
--- /dev/null
@@ -0,0 +1,20 @@
+/**
+ * FLL - Level 0
+ *
+ * Project: UTF
+ * API Version: 0.5
+ * Licenses: lgpl-2.1-or-later
+ *
+ * Test the function in the utf project.
+ */
+#ifndef _TEST__F_utf_is_zero_width_h
+#define _TEST__F_utf_is_zero_width_h
+
+/**
+ * Test that the function works.
+ *
+ * @see f_utf_is_zero_width()
+ */
+extern void test__f_utf_is_zero_width__works(void **state);
+
+#endif // _TEST__F_utf_is_zero_width_h
index 00440532bc9b247c9cc0821a415e9b85d0670ee7..c091697565234d5ff2c81d04b11fbcc5ec31d4d7 100644 (file)
@@ -24,9 +24,25 @@ int main(void) {
     cmocka_unit_test(test__f_utf_append_assure_nulless__works),
     cmocka_unit_test(test__f_utf_append_nulless__works),
 
+    //cmocka_unit_test(test__f_utf_character_is_alphabetic__works),
+    //cmocka_unit_test(test__f_utf_character_is_combining__works),
+    cmocka_unit_test(test__f_utf_character_is_control__works),
+    cmocka_unit_test(test__f_utf_character_is_digit__works),
+    cmocka_unit_test(test__f_utf_character_is_emoji__works),
+    //cmocka_unit_test(test__f_utf_character_is_numeric__works),
     cmocka_unit_test(test__f_utf_character_is_private__works),
     cmocka_unit_test(test__f_utf_character_is_punctuation__works),
+    //cmocka_unit_test(test__f_utf_character_is_subscript__works),
+    //cmocka_unit_test(test__f_utf_character_is_superscript__works),
+    //cmocka_unit_test(test__f_utf_character_is_surrogate__works),
     cmocka_unit_test(test__f_utf_character_is_symbol__works),
+    cmocka_unit_test(test__f_utf_character_is_valid__works),
+    //cmocka_unit_test(test__f_utf_character_is_whitespace__works),
+    //cmocka_unit_test(test__f_utf_character_is_wide__works),
+    //cmocka_unit_test(test__f_utf_character_is_zero_width__works),
+
+    //cmocka_unit_test(test__f_utf_character_is_word__strict_is_false),
+    //cmocka_unit_test(test__f_utf_character_is_word__strict_is_true),
 
     cmocka_unit_test(test__f_utf_dynamic_adjust__works),
 
@@ -116,9 +132,25 @@ int main(void) {
     cmocka_unit_test(test__f_utf_dynamicss_increase_by__works),
     cmocka_unit_test(test__f_utf_dynamicss_resize__works),
 
+    //cmocka_unit_test(test__f_utf_is_alphabetic__works),
+    //cmocka_unit_test(test__f_utf_is_combining__works),
+    cmocka_unit_test(test__f_utf_is_control__works),
+    cmocka_unit_test(test__f_utf_is_digit__works),
+    cmocka_unit_test(test__f_utf_is_emoji__works),
+    //cmocka_unit_test(test__f_utf_is_numeric__works),
     cmocka_unit_test(test__f_utf_is_private__works),
     cmocka_unit_test(test__f_utf_is_punctuation__works),
+    //cmocka_unit_test(test__f_utf_is_subscript__works),
+    //cmocka_unit_test(test__f_utf_is_superscript__works),
+    //cmocka_unit_test(test__f_utf_is_surrogate__works),
     cmocka_unit_test(test__f_utf_is_symbol__works),
+    cmocka_unit_test(test__f_utf_is_valid__works),
+    //cmocka_unit_test(test__f_utf_is_whitespace__works),
+    //cmocka_unit_test(test__f_utf_is_wide__works),
+    //cmocka_unit_test(test__f_utf_is_zero_width__works),
+
+    //cmocka_unit_test(test__f_utf_is_word__strict_is_false),
+    //cmocka_unit_test(test__f_utf_is_word__strict_is_true),
 
     cmocka_unit_test(test__f_utf_map_multis_adjust__works),
     cmocka_unit_test(test__f_utf_map_multis_append__works),
index fbb37fbae65f68cbbb060b128ec7a7b0c204f28f..5d7bdbf7bae2c06277cbb39394918b51671b880a 100644 (file)
 #include "test-utf-append_assure.h"
 #include "test-utf-append_assure_nulless.h"
 #include "test-utf-append_nulless.h"
+#include "test-utf-character_is_alphabetic.h"
+#include "test-utf-character_is_combining.h"
+#include "test-utf-character_is_control.h"
+#include "test-utf-character_is_digit.h"
+#include "test-utf-character_is_emoji.h"
+#include "test-utf-character_is_numeric.h"
+#include "test-utf-character_is_phonetic.h"
 #include "test-utf-character_is_private.h"
 #include "test-utf-character_is_punctuation.h"
+#include "test-utf-character_is_subscript.h"
+#include "test-utf-character_is_superscript.h"
+#include "test-utf-character_is_surrogate.h"
 #include "test-utf-character_is_symbol.h"
+#include "test-utf-character_is_valid.h"
+#include "test-utf-character_is_whitespace.h"
+#include "test-utf-character_is_wide.h"
+#include "test-utf-character_is_word.h"
+#include "test-utf-character_is_zero_width.h"
 #include "test-utf-dynamic_adjust.h"
 #include "test-utf-dynamic_append.h"
 #include "test-utf-dynamic_append_assure.h"
 #include "test-utf-dynamicss_increase.h"
 #include "test-utf-dynamicss_increase_by.h"
 #include "test-utf-dynamicss_resize.h"
+#include "test-utf-is_alphabetic.h"
+#include "test-utf-is_combining.h"
+#include "test-utf-is_control.h"
+#include "test-utf-is_digit.h"
+#include "test-utf-is_emoji.h"
+#include "test-utf-is_numeric.h"
+#include "test-utf-is_phonetic.h"
 #include "test-utf-is_private.h"
 #include "test-utf-is_punctuation.h"
+#include "test-utf-is_subscript.h"
+#include "test-utf-is_superscript.h"
+#include "test-utf-is_surrogate.h"
 #include "test-utf-is_symbol.h"
+#include "test-utf-is_valid.h"
+#include "test-utf-is_whitespace.h"
+#include "test-utf-is_wide.h"
+#include "test-utf-is_word.h"
+#include "test-utf-is_zero_width.h"
 #include "test-utf-map_multis_adjust.h"
 #include "test-utf-map_multis_append.h"
 #include "test-utf-map_multis_append_all.h"