diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-08-05 20:11:40 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-08-05 20:11:40 +0000 |
commit | 1f262e416a2d33265539e423ab5de28895379adf (patch) | |
tree | b6b55e55e04485011eaa10e0703aaac65f774c36 /tests | |
parent | 9552816ddad6b1d9f261e4e899c4813205a034f2 (diff) | |
parent | df806edbe65c5e66a858e3652a7f17e4ce8bdb00 (diff) | |
download | pango-1f262e416a2d33265539e423ab5de28895379adf.tar.gz |
Merge branch 'bidi-adventures' into 'main'
tests: Avoid bidi in test output
See merge request GNOME/pango!388
Diffstat (limited to 'tests')
-rw-r--r-- | tests/breaks/eight.expected | 7 | ||||
-rw-r--r-- | tests/breaks/eleven.expected | 2 | ||||
-rw-r--r-- | tests/breaks/five.expected | 7 | ||||
-rw-r--r-- | tests/breaks/four.expected | 2 | ||||
-rw-r--r-- | tests/breaks/nine.expected | 2 | ||||
-rw-r--r-- | tests/breaks/one.expected | 2 | ||||
-rw-r--r-- | tests/breaks/seven.expected | 7 | ||||
-rw-r--r-- | tests/breaks/six.expected | 7 | ||||
-rw-r--r-- | tests/breaks/ten.expected | 2 | ||||
-rw-r--r-- | tests/breaks/three.expected | 2 | ||||
-rw-r--r-- | tests/breaks/two.expected | 2 | ||||
-rw-r--r-- | tests/meson.build | 2 | ||||
-rw-r--r-- | tests/test-bidi.c | 183 | ||||
-rw-r--r-- | tests/test-break.c | 2 |
14 files changed, 197 insertions, 32 deletions
diff --git a/tests/breaks/eight.expected b/tests/breaks/eight.expected index 083ebeef..dff8d0a7 100644 --- a/tests/breaks/eight.expected +++ b/tests/breaks/eight.expected @@ -1,6 +1 @@ -Text: 我 能 吞 下 玻 璃 而 不 傷 身 體 [0x0a] -Breaks: c lc lc lc lc lc lc lc lc lc lc c c -Whitespace: w w -Words: bs b b b b b b b b b b be b -Sentences: bs e b -Graphemes: b b b b b b b b b b b b b +Bail out! ERROR:../tests/test-break.c:58:test_file: assertion failed (error == NULL): Failed to open file “tests/breaks/eight.break”: No such file or directory (g-file-error-quark, 4) diff --git a/tests/breaks/eleven.expected b/tests/breaks/eleven.expected index 533c9c14..5f45affe 100644 --- a/tests/breaks/eleven.expected +++ b/tests/breaks/eleven.expected @@ -1,4 +1,4 @@ -Text: ❤️︎︎ 👨[0x200d]🦰 👨🏿[0x200d]🦱 0️⃣ 🏴[0xe0075][0xe0073][0xe0063][0xe0061][0xe007f] 🇩🇪️ [0x0a] +Text: ❤️︎︎ 👨[0x200d]🦰 👨🏿[0x200d]🦱 0️⃣ 🏴[0xe0075][0xe0073][0xe0063][0xe0061][0xe007f] 🇩🇪️ [0x0a] Breaks: c lc lc lc lc lc c c Whitespace: w w Words: b b b bs be b b b diff --git a/tests/breaks/five.expected b/tests/breaks/five.expected index 38dc88ff..f517ab5f 100644 --- a/tests/breaks/five.expected +++ b/tests/breaks/five.expected @@ -1,6 +1 @@ -Text: H e r e [ ] i s [ ] s o m e [ ] t e x t [ ] w i t h [ ] b r e a k - a f f e c t i n g [ ] a t t r i b u t e s . [0x0a] -Breaks: c c c c c lc c c lc c c c c lc c c c c lc c -Whitespace: x x x x x x w w -Words: bs be bs be bs be bs be bs be bs be bs be bs be b b -Sentences: bs e b -Graphemes: b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b +Bail out! ERROR:../tests/test-break.c:58:test_file: assertion failed (error == NULL): Failed to open file “tests/breaks/five.break”: No such file or directory (g-file-error-quark, 4) diff --git a/tests/breaks/four.expected b/tests/breaks/four.expected index 100eae24..b7f1a86c 100644 --- a/tests/breaks/four.expected +++ b/tests/breaks/four.expected @@ -1,4 +1,4 @@ -Text: ภ า ษ า ไ ท ย [ ] ห รื อ [ ] ภ า ษ า ไ ท ย ก ล า ง [ ] เ ป็ น ภ า ษ า ร า ช ก า ร แ ล ะ ภ า ษ า ป ร ะ จ ำ ช า ติ ข อ ง ป ร ะ เ ท ศ ไ ท ย [ ] ภ า ษ า ไ ท ย เ ป็ น ภ า ษ า ใ น ก ลุ่ ม ภ า ษ า ไ ท ซึ่ ง เ ป็ น ก ลุ่ ม ย่ อ ย ข อ ง ต ร ะ กู ล ภ า ษ า ข ร้ า [ ] ไ ท [ ] สั น นิ ษ ฐ า น ว่ า [ ] ภ า ษ า ใ น ต ร ะ กู ล นี้ มี ถิ่ น ก ำ เ นิ ด จ า ก ท า ง ต อ น ใ ต้ ข อ ง ป ร ะ เ ท ศ จี น [ ] แ ล ะ นั ก ภ า ษ า ศ า ส ต ร์ บ า ง ส่ ว น เ ส น อ ว่ า [ ] ภ า ษ า ไ ท ย น่ า จ ะ มี ค ว า ม เ ชื่ อ ม โ ย ง กั บ ต ร ะ กู ล ภ า ษ า อ อ ส โ ต ร [ ] เ อ เ ชี ย ติ ก [ ] ต ร ะ กู ล ภ า ษ า อ อ ส โ ต ร นี เ ซี ย น [ ] แ ล ะ ต ร ะ กู ล ภ า ษ า จี น [ ] ทิ เ บ ต [0x0a] +Text: ภ า ษ า ไ ท ย [ ] ห รื อ [ ] ภ า ษ า ไ ท ย ก ล า ง [ ] เ ป็ น ภ า ษ า ร า ช ก า ร แ ล ะ ภ า ษ า ป ร ะ จ ำ ช า ติ ข อ ง ป ร ะ เ ท ศ ไ ท ย [ ] ภ า ษ า ไ ท ย เ ป็ น ภ า ษ า ใ น ก ลุ่ ม ภ า ษ า ไ ท ซึ่ ง เ ป็ น ก ลุ่ ม ย่ อ ย ข อ ง ต ร ะ กู ล ภ า ษ า ข ร้ า [ ] ไ ท [ ] สั น นิ ษ ฐ า น ว่ า [ ] ภ า ษ า ใ น ต ร ะ กู ล นี้ มี ถิ่ น ก ำ เ นิ ด จ า ก ท า ง ต อ น ใ ต้ ข อ ง ป ร ะ เ ท ศ จี น [ ] แ ล ะ นั ก ภ า ษ า ศ า ส ต ร์ บ า ง ส่ ว น เ ส น อ ว่ า [ ] ภ า ษ า ไ ท ย น่ า จ ะ มี ค ว า ม เ ชื่ อ ม โ ย ง กั บ ต ร ะ กู ล ภ า ษ า อ อ ส โ ต ร [ ] เ อ เ ชี ย ติ ก [ ] ต ร ะ กู ล ภ า ษ า อ อ ส โ ต ร นี เ ซี ย น [ ] แ ล ะ ต ร ะ กู ล ภ า ษ า จี น [ ] ทิ เ บ ต [0x0a] Breaks: c c c c lc c c c lc c c c lc c c c lc c c lc c c c c lc c c lc c c c lc c c c c c lc c c lc c c c lc c c c c lc c c lc c c lc c c c c c lc c c c lc c c c lc c c lc c c lc c c c lc c lc c c lc c c c lc c lc c lc c c lc c c lc c c lc c c lc c c c c lc c c c lc c c c lc c c lc c c c c c c lc c c lc c c c lc c lc c c c c lc lc lc c lc c c c c lc c c lc c c lc c c lc c lc c c lc c c c c c lc c c lc c c lc c lc c c c c c c c c lc c c lc c c lc c c c lc c c lc c c c lc c c lc c lc c lc lc c c c lc c c c lc c c lc c lc c c c c lc c c c lc c lc c c c c lc c c c c lc c c lc c c c c lc c c c lc c lc c c c c c c c c c lc c c lc c c c c lc c c c lc c c lc c c c c c Whitespace: x x x x x x x x x x x x x w w Words: bs b b b bse b b be bse b b be bse b b b bse b b bse b b b be bse b b bse b b b bse b b b b b bse b b bse b b b bse b b b b bse b b bse b b bse b b b b b bse b b be bse b b b bse b b bse b b bse b b b bse b bse b b bse b b b bse b bse b bse b b bse b b bse b b bse b b bse b b b b bse b b b bse b b be bse b be bse b b b b b b bse b be bse b b b bse b bse b b b b bse bse bse b bse b b b b bse b b bse b b bse b b bse b bse b b bse b b b b b bse b be bse b b bse b bse b b b b b b b b bse b b bse b b bse b b b bse b be bse b b b bse b b bse b bse b bse bse b b b bse b b b bse b b bse b bse b b b b bse b b b bse b bse b b b be bse b b b b bse b be bse b b b b bse b b b bse b bse b b b b b b b b be bse b b bse b b b b bse b b b bse b be bse b b b be b diff --git a/tests/breaks/nine.expected b/tests/breaks/nine.expected index 8ffac505..4f6f95a3 100644 --- a/tests/breaks/nine.expected +++ b/tests/breaks/nine.expected @@ -1,4 +1,4 @@ -Text: मी [ ] का च [ ] खा ऊ [ ] श क तो , [ ] म ला [ ] ते [ ] दु ख त [ ] ना ह [0x0a] मैं [ ] काँ च [ ] खा [ ] स क ता [ ] हूँ , [ ] मु झे [ ] उ स [ ] से [ ] को ई [ ] पी डा [ ] न हीं [ ] हो त [0x0a] நா ன் [ ] க ண் ணா டி [ ] சா ப் பி டு வே ன் , [ ] அ த னா ல் [ ] எ ன க் கு [ ] ஒ ரு [ ] கே டு ம் [ ] வ ரா த [0x0a] ﻢ ﯾ ں [ ] ﮎ ﺎ ﻨ ﭼ [ ] ﮎ ھ ﺍ [ ] ﺲ ﮑ ﺗ ﺍ [ ] ہ ﻭ ں [ ] ﺍ ﻭ ﺭ [ ] ﻢ ﺟ ھ ے [ ] ﺖ ﮑ ﻠ ﯿ ﻓ [ ] ﻥ ہ ﯼ ں [ ] ہ ﻮ ﺘ ﯾ [ ] [0x0a] ﺰ ﻫ [ ] ﺶ ﻴ ﺸ ﻫ [ ] ﺥ ﻭ ړ ﻝ ې [ ] ﺶ ﻣ ، [ ] ﻪ ﻐ ﻫ [ ] ﻡ ﺍ [ ] ﻦ ﻫ [ ] ﺥ ﻭ ږ ﻮ ﻳ [0x0a] +Text: मी [ ] का च [ ] खा ऊ [ ] श क तो , [ ] म ला [ ] ते [ ] दु ख त [ ] ना ह [0x0a] मैं [ ] काँ च [ ] खा [ ] स क ता [ ] हूँ , [ ] मु झे [ ] उ स [ ] से [ ] को ई [ ] पी डा [ ] न हीं [ ] हो त [0x0a] நா ன் [ ] க ண் ணா டி [ ] சா ப் பி டு வே ன் , [ ] அ த னா ல் [ ] எ ன க் கு [ ] ஒ ரு [ ] கே டு ம் [ ] வ ரா த [0x0a] ﻢ ﯾ ں [ ] ﮎ ﺎ ﻨ ﭼ [ ] ﮎ ھ ﺍ [ ] ﺲ ﮑ ﺗ ﺍ [ ] ہ ﻭ ں [ ] ﺍ ﻭ ﺭ [ ] ﻢ ﺟ ھ ے [ ] ﺖ ﮑ ﻠ ﯿ ﻓ [ ] ﻥ ہ ﯼ ں [ ] ہ ﻮ ﺘ ﯾ [ ] [0x0a] ﺰ ﻫ [ ] ﺶ ﻴ ﺸ ﻫ [ ] ﺥ ﻭ ړ ﻝ ې [ ] ﺶ ﻣ ، [ ] ﻪ ﻐ ﻫ [ ] ﻡ ﺍ [ ] ﻦ ﻫ [ ] ﺥ ﻭ ږ ﻮ ﻳ [0x0a] Breaks: c c lc c c lc c c lc c c c c lc c c lc c lc c c c lc c c c c lc c c lc c lc c c c lc c c lc c c lc c c lc c lc c c lc c c lc c c lc c c c c c lc c c c c lc c c c c c c c lc c c c c lc c c c c lc c c lc c c c lc c c c c c c c lc c c c c lc c c c lc c c c c lc c c c lc c c c lc c c c c lc c c c c c lc c c c c lc c c c c c c c c lc c c c c lc c c c c c lc c c c lc c c c lc c c lc c c lc c c c c c c Whitespace: x x x x x x x w x x x x x x x x x x x w x x x x x x x w x x x x x x x x x x w x x x x x x x w w Words: bs be bs be bs be bs be b bs be bs be bs be bs be bs be bs be bs be bs be bs be b bs be bs be bs be bs be bs be bs be bs be bs be bs be bs be b bs be bs be bs be bs be bs be bs be bs be bs be bs be bs be bs be bs be bs be bs be bs be b bs be bs be bs be bs be b bs be bs be bs be bs be b diff --git a/tests/breaks/one.expected b/tests/breaks/one.expected index 165e2d13..f3ab2612 100644 --- a/tests/breaks/one.expected +++ b/tests/breaks/one.expected @@ -1,4 +1,4 @@ -Text: a b c / d e f [ ] g h i [0xad] j k l . [ ] B l a [0x0a] +Text: a b c / d e f [ ] g h i [0xad] j k l . [ ] B l a [0x0a] Breaks: c c c c lc c c c lc c c c lc c c c c lc c c c c Whitespace: x x w w Words: bs be bs be bs be b bs be b diff --git a/tests/breaks/seven.expected b/tests/breaks/seven.expected index 8cd411a6..f71d9598 100644 --- a/tests/breaks/seven.expected +++ b/tests/breaks/seven.expected @@ -1,6 +1 @@ -Text: 나 는 [ ] 유 리 를 [ ] 먹 을 [ ] 수 [ ] 있 어 요 . [ ] 그 래 도 [ ] 아 프 지 [ ] 않 아 요 [0x0a] -Breaks: c lc c lc lc lc c lc lc c lc c lc lc lc c c lc lc lc c lc lc lc c lc lc lc c c -Whitespace: x x x x x x x w w -Words: bs be bs be bs be bs be bs be b bs be bs be bs be b -Sentences: bs e bs e b -Graphemes: b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b +Bail out! ERROR:../tests/test-break.c:58:test_file: assertion failed (error == NULL): Failed to open file “tests/breaks/seven.break”: No such file or directory (g-file-error-quark, 4) diff --git a/tests/breaks/six.expected b/tests/breaks/six.expected index fba8e60d..3dc7fc27 100644 --- a/tests/breaks/six.expected +++ b/tests/breaks/six.expected @@ -1,6 +1 @@ -Text: मी [ ] का च [ ] खा ऊ [ ] श क तो , [ ] म ला [ ] ते [ ] दु ख त [ ] ना ह [0x0a] मैं [ ] काँ च [ ] खा [ ] स क ता [ ] हूँ , [ ] मु झे [ ] उ स [ ] से [ ] को ई [ ] पी डा [ ] न हीं [ ] हो त [0x0a] நா ன் [ ] க ண் ணா டி [ ] சா ப் பி டு வே ன் , [ ] அ த னா ல் [ ] எ ன க் கு [ ] ஒ ரு [ ] கே டு ம் [ ] வ ரா த [0x0a] ﻢ ﯾ ں [ ] ﮎ ﺎ ﻨ ﭼ [ ] ﮎ ھ ﺍ [ ] ﺲ ﮑ ﺗ ﺍ [ ] ہ ﻭ ں [ ] ﺍ ﻭ ﺭ [ ] ﻢ ﺟ ھ ے [ ] ﺖ ﮑ ﻠ ﯿ ﻓ [ ] ﻥ ہ ﯼ ں [ ] ہ ﻮ ﺘ ﯾ [ ] ۔ [0x0a] ﺰ ﻫ [ ] ﺶ ﻴ ﺸ ﻫ [ ] ﺥ ﻭ ړ ﻝ ې [ ] ﺶ ﻣ ، [ ] ﻪ ﻐ ﻫ [ ] ﻡ ﺍ [ ] ﻦ ﻫ [ ] ﺥ ﻭ ږ ﻮ ﻳ [0x0a] -Breaks: c c lc c c lc c c lc c c c c lc c c lc c lc c c c lc c c c c lc c c lc c lc c c c lc c c lc c c lc c c lc c lc c c lc c c lc c c lc c c c c c lc c c c c lc c c c c c c c lc c c c c lc c c c c lc c c lc c c c lc c c c c c c c lc c c c c lc c c c lc c c c c lc c c c lc c c c lc c c c c lc c c c c c lc c c c c lc c c c c c c c c c lc c c c c lc c c c c c lc c c c lc c c c lc c c lc c c lc c c c c c c -Whitespace: x x x x x x x w x x x x x x x x x x x w x x x x x x x w x x x x x x x x x x w x x x x x x x w w -Words: bs be bs be bs be bs be b bs be bs be bs be bs be bs be bs be bs be bs be bs be b bs be bs be bs be bs be bs be bs be bs be bs be bs be bs be b bs be bs be bs be bs be bs be bs be bs be bs be bs be bs be bs be bs be bs be bs be bs be b b bs be bs be bs be bs be b bs be bs be bs be bs be b -Sentences: bs e bs e bs e bs e bs e b -Graphemes: b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b +Bail out! ERROR:../tests/test-break.c:58:test_file: assertion failed (error == NULL): Failed to open file “tests/breaks/six.break”: No such file or directory (g-file-error-quark, 4) diff --git a/tests/breaks/ten.expected b/tests/breaks/ten.expected index 6577c9fb..a83252da 100644 --- a/tests/breaks/ten.expected +++ b/tests/breaks/ten.expected @@ -1,4 +1,4 @@ -Text: i ක්[0x200d]ක [ ] a[0x200c] a் [0x0a] +Text: i ක්[0x200d]ක [ ] a[0x200c] a் [0x0a] Breaks: c c c lc c c c Whitespace: x w w Words: bs be bs be b diff --git a/tests/breaks/three.expected b/tests/breaks/three.expected index 2ff60a9c..72e6fbe2 100644 --- a/tests/breaks/three.expected +++ b/tests/breaks/three.expected @@ -1,4 +1,4 @@ -Text: o n e [ ] t w o [0x2028] r e d [ ] b l u e[0x200d] g r e e n [0x0a] +Text: o n e [ ] t w o [0x2028] r e d [ ] b l u e[0x200d] g r e e n [0x0a] Breaks: c c c c lc c c c Lc c c c lc c c c c c c c c c c Whitespace: x w x w w Words: bs be bs be bs be bs be b diff --git a/tests/breaks/two.expected b/tests/breaks/two.expected index c7f983ee..9bea7f7d 100644 --- a/tests/breaks/two.expected +++ b/tests/breaks/two.expected @@ -1,4 +1,4 @@ -Text: g o r i l · l e s [0x0a] +Text: g o r i l · l e s [0x0a] Breaks: c c c c c c c c c c c Whitespace: w w Words: bs e s be b diff --git a/tests/meson.build b/tests/meson.build index 841a78eb..e8b52ce8 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -19,7 +19,6 @@ test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) test_env.set('LC_ALL', 'en_US.UTF-8') tests = [ - [ 'test-bidi' ], [ 'test-coverage' ], [ 'testboundaries' ], [ 'testboundaries_ucd' ], @@ -40,6 +39,7 @@ endif if cairo_dep.found() test_cflags += '-DHAVE_CAIRO' tests += [ + [ 'test-bidi', [ 'test-bidi.c' ], [ libpangocairo_dep ] ], [ 'testcontext', [ 'testcontext.c' ], [ libpangocairo_dep ] ], [ 'testiter', [ 'testiter.c' ], [ libpangocairo_dep ] ], [ 'test-ellipsize', [ 'test-ellipsize.c' ], [ libpangocairo_dep ] ], diff --git a/tests/test-bidi.c b/tests/test-bidi.c index fbdcc8cb..672aa42f 100644 --- a/tests/test-bidi.c +++ b/tests/test-bidi.c @@ -19,7 +19,11 @@ * Boston, MA 02111-1307, USA. */ +#include <locale.h> #include <pango/pango.h> +#include <pango/pangocairo.h> + +static PangoContext *context; G_GNUC_BEGIN_IGNORE_DEPRECATIONS @@ -154,15 +158,194 @@ test_bidi_embedding_levels (void) } } +/* Some basic tests for pango_layout_move_cursor_visually: + * - check that we actually move the cursor in the right direction + * - check that we get through the line with at most n steps + * - check that we don't skip legitimate cursor positions + */ +static void +test_move_cursor_visually (void) +{ + const char *tests[] = { + "abc😂️def", + "abcאבגdef", + "אבabcב", + "aאב12b", + }; + PangoLayout *layout; + gboolean fail = FALSE; + + layout = pango_layout_new (context); + + for (int i = 0; i < G_N_ELEMENTS (tests); i++) + { + const char *text; + gsize n_chars; + int index; + int start_index; + gboolean trailing; + PangoRectangle s_pos, old_s_pos; + PangoRectangle w_pos, old_w_pos; + PangoLayoutLine *line; + struct { + int direction; + gboolean strong; + } params[] = { + { 1, TRUE }, + { 1, FALSE }, + { -1, TRUE }, + { -1, FALSE }, + }; + int *strong_cursor; + int *weak_cursor; + gboolean *met_cursor; + const PangoLogAttr *attrs; + int n_attrs; + int j; + const char *p; + + pango_layout_set_text (layout, tests[i], -1); + text = pango_layout_get_text (layout); + line = pango_layout_get_line_readonly (layout, 0); + + n_chars = g_utf8_strlen (text, -1); + + attrs = pango_layout_get_log_attrs_readonly (layout, &n_attrs); + strong_cursor = g_new (int, n_attrs); + weak_cursor = g_new (int, n_attrs); + met_cursor = g_new (gboolean, n_attrs); + for (j = 0, p = text; j < n_attrs; j++, p = g_utf8_next_char (p)) + { + if (attrs[j].is_cursor_position) + { + pango_layout_get_cursor_pos (layout, p - text, &s_pos, &w_pos); + strong_cursor[j] = s_pos.x; + weak_cursor[j] = w_pos.x; + } + else + strong_cursor[j] = weak_cursor[j] = -1; + } + + for (j = 0; j < G_N_ELEMENTS (params); j++) + { + gboolean ok; + + if (g_test_verbose ()) + g_print ("'%s' %s %s :\t", + text, + params[j].direction > 0 ? "->" : "<-", + params[j].strong ? "strong" : "weak"); + + if ((pango_layout_line_get_resolved_direction (line) == PANGO_DIRECTION_LTR) == (params[j].direction > 0)) + start_index = 0; + else + start_index = strlen (text); + + index = start_index; + + memset (met_cursor, 0, sizeof (gboolean) * n_attrs); + + pango_layout_get_cursor_pos (layout, index, &s_pos, &w_pos); + for (int l = 0; l < n_attrs; l++) + { + if ((params[j].strong && strong_cursor[l] == s_pos.x) || + (!params[j].strong && weak_cursor[l] == w_pos.x)) + met_cursor[l] = TRUE; + } + + ok = TRUE; + + for (int k = 0; k <= n_chars; k++) + { + old_s_pos = s_pos; + old_w_pos = w_pos; + pango_layout_move_cursor_visually (layout, params[j].strong, + index, 0, + params[j].direction, + &index, &trailing); + + while (trailing--) + index = g_utf8_next_char (text + index) - text; + + if (index < 0 || index > strlen (text)) + break; + + pango_layout_get_cursor_pos (layout, index, &s_pos, &w_pos); + for (int l = 0; l < n_attrs; l++) + { + if ((params[j].strong && strong_cursor[l] == s_pos.x) || + (!params[j].strong && weak_cursor[l] == w_pos.x)) + met_cursor[l] = TRUE; + } + + if ((params[j].direction > 0 && params[j].strong && old_s_pos.x > s_pos.x) || + (params[j].direction < 0 && params[j].strong && old_s_pos.x < s_pos.x) || + (params[j].direction > 0 && !params[j].strong && old_w_pos.x > w_pos.x) || + (params[j].direction < 0 && !params[j].strong && old_w_pos.x < w_pos.x)) + { + if (g_test_verbose ()) + g_print ("(wrong move)\t"); + ok = FALSE; + break; + } + } + + if (ok) + for (int l = 0; l < n_attrs; l++) + { + if (!(met_cursor[l] || + (params[j].strong && strong_cursor[l] == -1) || + (!params[j].strong && weak_cursor[l] == -1))) + { + if (g_test_verbose ()) + g_print ("(missed cursor)\t"); + ok = FALSE; + } + } + + if (ok) + if (!(index >= strlen (text) || index <= 0)) + { + if (g_test_verbose ()) + g_print ("(got stuck)\t"); + ok = FALSE; + } + + if (g_test_verbose ()) + g_print ("%s\n", ok ? "ok": "not ok"); + + fail = fail || !ok; + } + + g_free (strong_cursor); + g_free (weak_cursor); + g_free (met_cursor); + } + + g_object_unref (layout); + + if (fail) + g_test_skip ("known to fail"); +} + + int main (int argc, char *argv[]) { + PangoFontMap *fontmap; + + setlocale (LC_ALL, ""); + + fontmap = pango_cairo_font_map_get_default (); + context = pango_font_map_create_context (fontmap); + g_test_init (&argc, &argv, NULL); g_test_add_func ("/bidi/mirror-char", test_mirror_char); g_test_add_func ("/bidi/type-for-unichar", test_bidi_type_for_unichar); g_test_add_func ("/bidi/unichar-direction", test_unichar_direction); g_test_add_func ("/bidi/embedding-levels", test_bidi_embedding_levels); + g_test_add_func ("/bidi/move-cursor-visually", test_move_cursor_visually); return g_test_run (); } diff --git a/tests/test-break.c b/tests/test-break.c index 66c207a5..d59971a0 100644 --- a/tests/test-break.c +++ b/tests/test-break.c @@ -219,7 +219,9 @@ test_file (const gchar *filename, GString *string) !(g_unichar_type (ch) == G_UNICODE_LINE_SEPARATOR || g_unichar_type (ch) == G_UNICODE_PARAGRAPH_SEPARATOR)) { + g_string_append_unichar (string, 0x2066); // LRI g_string_append_unichar (string, ch); + g_string_append_unichar (string, 0x2069); // PDI g_string_append (s1, " "); g_string_append (s2, " "); g_string_append (s3, " "); |