xref: /freebsd/contrib/one-true-awk/testdir/T.utf (revision d7847a8d351436a4654bd2c746bc9c04401160ee)
1#!/bin/sh
2
3echo T.utf: tests of utf functions
4
5awk=${awk-../a.out}
6
7$awk '
8BEGIN {
9	FS = "\t"
10	awk = "../a.out"
11}
12NF == 0 || $1 ~ /^#/ {
13	next
14}
15$1 ~ /try/ {	# new test
16	nt++
17	sub(/try [a-zA-Z_0-9]+ /, "")
18	prog = $0
19	printf("try %3d %s\n", nt, prog)
20	prog = sprintf("%s -F\"\\t\" '"'"'%s'"'"'", awk, prog)
21	# print "prog is", prog
22	nt2 = 0
23	while (getline > 0) {
24		if (NF == 0)	# blank line terminates a sequence
25			break
26		input = $1
27		for (i = 2; i < NF; i++)	# input data
28			input = input "\t" $i
29		test = sprintf("./echo '"'"'%s'"'"' | %s >foo1; ",
30			input, prog)
31		if ($NF == "\"\"")
32			output = ">foo2;"
33		else
34			output = sprintf("./echo '"'"'%s'"'"' >foo2; ", $NF)
35		gsub(/\\t/, "\t", output)
36		gsub(/\\n/, "\n", output)
37		run = sprintf("diff foo1 foo2 || echo test %d.%d failed",
38			nt, ++nt2)
39		# print  "input is", input
40		# print  "test is", test
41		# print  "output is", output
42		# print  "run is", run
43		system(test output run)
44	}
45	tt += nt2
46}
47END { print tt, "tests" }
48' <<\!!!!
49# General format:
50# try program as rest of line
51# $1	$2	$3	output1  (\t for tab, \n for newline,
52# $1	$2	$3	output2  ("" for null)
53# ... terminated by blank line
54
55# try another program...
56
57try length { print length($1) }
58	0
59a	1
60の今がその時だ	7
61Сейчас	6
62现在是时候了	6
63给所有的好男	6
64来参加聚会。	6
65��	1
66�� finger	8
67Τωρα	4
68για	3
69να	2
70עכשיו	5
71לכל	3
72לבוא	4
73の今がその時だ	7
74지금이	3
75모든	2
76파티에	3
77Сейчас	6
78для	3
79прийти	6
80
81try index { print index($1, $2) }
82abc	a	1
83abc	b	2
84abc	x	0
85现在是时候了	""	0
86现在是时候了	了	6
87现在是时候了	在是	2
88现在是时候了	x	0
89x在是时候了	x	2
90�� fingerすべての善人のためにすべての善人のために	f	3
91�� finger��	r��	8
92
93try substr { print substr($0, 2, 3) }
94abcdef	bcd
95Τωρα ειναι η	ωρα
96Τω	ω
97지금 이절호의	금 이
98xпyрийти	пyр
99
100try rematch { print $1 ~ $2 }
101abc	a	1
102abc	x	0
103すべての善人のために	の	1
104すべての善人のために	の.*の	1
105すべての善人のために	の.*て	0
106Τωρα	ω+	1
107
108# replace first occurrence of $2 by $3 in $1
109try sub { n = sub($2, $3, $1); print n, $1 }
110abcdef	bc	XYZ	1 aXYZdef
111abcdef	xy	XYZ	0 abcdef
112の今がその時だ	の	NO	1 NO今がその時だ
113�� finger	��.*g	FING	1 FINGer
114Сейчас	.	x	1 xейчас
115
116# replace all occurrences of $2 by $3 in $1
117try gsub { n = gsub($2, $3, $1); print n, $1 }
118abcdef	bc	XYZ	1 aXYZdef
119abcdef	xy	XYZ	0 abcdef
120の今がその時だ	の	NO	2 NO今がそNO時だ
121�� finger	��.*g	FING	1 FINGer
122Сейчас	.	x	6 xxxxxx
123
124try match { print match($1, $2), RSTART, RLENGTH }
125abc	[^a]	2 2 1
126abc	[^ab]	3 3 1
127すべての善人のために	[^す]	2 2 1
128すべての善人のために	[^ぁ-ゖ]	5 5 1
129abc	a	1 1 1
130abc	x	0 0 -1
131すべての善人のために	の	4 4 1
132すべての善人のために	の.*の	4 4 4
133すべての善人のために	の.*て	0 0 -1
134Τωρα	ω+	2 2 1
135Τωρα	x+	0 0 -1
136Τωρα	ω.	2 2 2
137すべての善人のために	[の]	4 4 1
138すべての善人のために	[ぁ-え]	0 0 -1
139すべての善人のために	[^ぁ-え]	1 1 1
140Τωρα ειναι η	[α-ω]	2 2 1
141Τωρα ειναι η	[α-ω]+	2 2 3
142xxxΤωρα ειναι η	[Α-Ω]	4 4 1
143για όλους τους καλούς ά	α.*α	3 3 15
144να έρθει στο πά	[^ν]	2 2 1
145
146# FS="" should split into unicode chars
147try emptyFS BEGIN {FS=""} {print NF}
148すべての善人のために	10
149の今がその時だ	7
150Сейчас	6
151现在是时候了	6
152给所有的好男	6
153来参加聚会。	6
154��	1
155�� finger	8
156
157# printf(%N.Ns) for utf8 strings
158try printfs1 {printf("[%5.2s][%-5.2s]\n"), $1, $1}
159abcd	[   ab][ab   ]
160现在abc	[   现在][现在   ]
161现ωabc	[   现ω][现ω   ]
162ωabc	[   ωa][ωa   ]
163Сейчас	[   Се][Се   ]
164Сейxyz	[   Се][Се   ]
165��	[    ��][��    ]
166
167# printf(%N.Ns) for utf8 strings
168try printfs2 {printf("[%5s][%-5s]\n"), $1, $1}
169abcd	[ abcd][abcd ]
170现在ab	[ 现在ab][现在ab ]
171a现在ab	[a现在ab][a现在ab]
172a现在abc	[a现在abc][a现在abc]
173现ωab	[ 现ωab][现ωab ]
174ωabc	[ ωabc][ωabc ]
175Сейчас	[Сейчас][Сейчас]
176��	[    ��][��    ]
177
178# printf(%N.Ns) for utf8 strings
179try printfs3 {printf("[%.2s][%-.2s]\n"), $1, $1}
180abcd	[ab][ab]
181现在abc	[现在][现在]
182现ωabc	[现ω][现ω]
183ω	[ω][ω]
184��	[��][��]
185
186# printf(%c) for utf
187try printfc {printf("%c %c\n", $1, substr($1,2,1))}
188すべての善人のために	す べ
189の今がその時だ	の 今
190Сейчас	С е
191现在是时候了	现 在
192����	�� ��
193
194!!!!
195