summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorEbrahim Byagowi <ebrahim@gnu.org>2018-11-24 20:07:24 +0330
committerGitHub <noreply@github.com>2018-11-24 20:07:24 +0330
commit24887d1115ee41cfad70577eb243382f6c23ab6e (patch)
tree250a78694e92a76e62f0d3a56db3062c1f3fbb26 /test
parentae96c98dfaef3a789227ffecd40b92518dface8a (diff)
Add Adobe AOTS tests (#1395)
Annotated OpenType Specification or aots, https://github.com/adobe-type-tools/aots provides a set of tests for OpenType specification, this change add those tests in addition to modified version of their HarfBuzz test runner for generating harfbuzz project specific tests.
Diffstat (limited to 'test')
-rw-r--r--test/shaping/CMakeLists.txt13
-rw-r--r--test/shaping/data/Makefile.am1
-rw-r--r--test/shaping/data/aots/COPYING13
-rw-r--r--test/shaping/data/aots/Makefile.am37
-rw-r--r--test/shaping/data/aots/Makefile.sources126
-rw-r--r--test/shaping/data/aots/fonts/classdef1_font3.otfbin0 -> 6060 bytes
-rw-r--r--test/shaping/data/aots/fonts/classdef1_font4.otfbin0 -> 5984 bytes
-rw-r--r--test/shaping/data/aots/fonts/classdef2_font1.otfbin0 -> 6004 bytes
-rw-r--r--test/shaping/data/aots/fonts/classdef2_font2.otfbin0 -> 6016 bytes
-rw-r--r--test/shaping/data/aots/fonts/classdef2_font3.otfbin0 -> 6052 bytes
-rw-r--r--test/shaping/data/aots/fonts/classdef2_font4.otfbin0 -> 5984 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap0_font1.otfbin0 -> 5196 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap10_font1.otfbin0 -> 4968 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap10_font2.otfbin0 -> 4960 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap12_font1.otfbin0 -> 4980 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap14_font1.otfbin0 -> 5028 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap2_font1.otfbin0 -> 6000 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap4_font1.otfbin0 -> 4964 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap4_font2.otfbin0 -> 4956 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap4_font3.otfbin0 -> 4956 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap4_font4.otfbin0 -> 4972 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap6_font1.otfbin0 -> 4948 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap6_font2.otfbin0 -> 4944 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap8_font1.otfbin0 -> 13224 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap_composition_font1.otfbin0 -> 5096 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap_subtableselection_font1.otfbin0 -> 6412 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap_subtableselection_font2.otfbin0 -> 6140 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap_subtableselection_font3.otfbin0 -> 5872 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap_subtableselection_font4.otfbin0 -> 5600 bytes
-rw-r--r--test/shaping/data/aots/fonts/cmap_subtableselection_font5.otfbin0 -> 5332 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos1_1_lookupflag_f1.otfbin0 -> 5208 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos1_1_simple_f1.otfbin0 -> 5136 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos1_1_simple_f2.otfbin0 -> 5136 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos1_1_simple_f3.otfbin0 -> 5136 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos1_1_simple_f4.otfbin0 -> 5136 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos1_2_font1.otfbin0 -> 5108 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos1_2_font2.otfbin0 -> 5148 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_1_font6.otfbin0 -> 5120 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_1_font7.otfbin0 -> 5132 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_1_lookupflag_f1.otfbin0 -> 5220 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_1_lookupflag_f2.otfbin0 -> 5220 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_1_next_glyph_f1.otfbin0 -> 5180 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_1_next_glyph_f2.otfbin0 -> 5176 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_1_simple_f1.otfbin0 -> 5148 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_2_font1.otfbin0 -> 5148 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_2_font2.otfbin0 -> 5188 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_2_font3.otfbin0 -> 5188 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_2_font4.otfbin0 -> 5148 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos2_2_font5.otfbin0 -> 5140 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos3_font1.otfbin0 -> 5120 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos3_font2.otfbin0 -> 5160 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos3_font3.otfbin0 -> 5164 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos4_lookupflag_f1.otfbin0 -> 5256 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos4_lookupflag_f2.otfbin0 -> 5240 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos4_multiple_anchors_1.otfbin0 -> 5352 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos4_simple_1.otfbin0 -> 5200 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos5_font1.otfbin0 -> 5284 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos6_font1.otfbin0 -> 5176 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos7_1_font1.otfbin0 -> 5160 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos9_font1.otfbin0 -> 5096 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos9_font2.otfbin0 -> 5124 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_boundary_f1.otfbin0 -> 5496 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_boundary_f2.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_boundary_f3.otfbin0 -> 5496 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_boundary_f4.otfbin0 -> 5496 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_lookupflag_f1.otfbin0 -> 5520 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f1.otfbin0 -> 5592 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f2.otfbin0 -> 5592 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_next_glyph_f1.otfbin0 -> 5540 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_simple_f1.otfbin0 -> 5488 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_simple_f2.otfbin0 -> 5488 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining1_successive_f1.otfbin0 -> 5524 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_boundary_f1.otfbin0 -> 5704 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_boundary_f2.otfbin0 -> 5708 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_boundary_f3.otfbin0 -> 5704 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_boundary_f4.otfbin0 -> 5704 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_lookupflag_f1.otfbin0 -> 5728 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f1.otfbin0 -> 5800 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f2.otfbin0 -> 5800 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_next_glyph_f1.otfbin0 -> 5744 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_simple_f1.otfbin0 -> 5696 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_simple_f2.otfbin0 -> 5696 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining2_successive_f1.otfbin0 -> 5732 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_boundary_f1.otfbin0 -> 5504 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_boundary_f2.otfbin0 -> 5508 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_boundary_f3.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_boundary_f4.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_lookupflag_f1.otfbin0 -> 5548 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_next_glyph_f1.otfbin0 -> 5524 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_simple_f1.otfbin0 -> 5496 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_simple_f2.otfbin0 -> 5516 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_chaining3_successive_f1.otfbin0 -> 5544 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_boundary_f1.otfbin0 -> 5480 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_boundary_f2.otfbin0 -> 5480 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_expansion_f1.otfbin0 -> 5492 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_lookupflag_f1.otfbin0 -> 5508 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_lookupflag_f2.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f1.otfbin0 -> 5568 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f2.otfbin0 -> 5568 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_next_glyph_f1.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_simple_f1.otfbin0 -> 5476 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_simple_f2.otfbin0 -> 5468 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context1_successive_f1.otfbin0 -> 5508 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_boundary_f1.otfbin0 -> 5492 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_boundary_f2.otfbin0 -> 5496 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_classes_f1.otfbin0 -> 5540 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_classes_f2.otfbin0 -> 5564 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_expansion_f1.otfbin0 -> 5524 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_lookupflag_f1.otfbin0 -> 5540 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_lookupflag_f2.otfbin0 -> 5532 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f1.otfbin0 -> 5600 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f2.otfbin0 -> 5600 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_next_glyph_f1.otfbin0 -> 5512 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_simple_f1.otfbin0 -> 5508 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_simple_f2.otfbin0 -> 5484 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context2_successive_f1.otfbin0 -> 5544 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context3_boundary_f1.otfbin0 -> 5476 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context3_boundary_f2.otfbin0 -> 5472 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context3_lookupflag_f1.otfbin0 -> 5512 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context3_lookupflag_f2.otfbin0 -> 5504 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context3_next_glyph_f1.otfbin0 -> 5496 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context3_simple_f1.otfbin0 -> 5480 bytes
-rw-r--r--test/shaping/data/aots/fonts/gpos_context3_successive_f1.otfbin0 -> 5516 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub1_1_lookupflag_f1.otfbin0 -> 5208 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub1_1_modulo_f1.otfbin0 -> 5216 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub1_1_simple_f1.otfbin0 -> 5136 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub1_2_lookupflag_f1.otfbin0 -> 5212 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub1_2_simple_f1.otfbin0 -> 5140 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub2_1_lookupflag_f1.otfbin0 -> 5224 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub2_1_multiple_sequences_f1.otfbin0 -> 5248 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub2_1_simple_f1.otfbin0 -> 5144 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub3_1_lookupflag_f1.otfbin0 -> 5224 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub3_1_multiple_f1.otfbin0 -> 5168 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub3_1_simple_f1.otfbin0 -> 5144 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub4_1_lookupflag_f1.otfbin0 -> 5220 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f1.otfbin0 -> 5252 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f2.otfbin0 -> 5252 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub4_1_multiple_ligsets_f1.otfbin0 -> 5240 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub4_1_simple_f1.otfbin0 -> 5148 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub7_font1.otfbin0 -> 5096 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub7_font2.otfbin0 -> 5116 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_boundary_f1.otfbin0 -> 5516 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_boundary_f2.otfbin0 -> 5520 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_boundary_f3.otfbin0 -> 5520 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_boundary_f4.otfbin0 -> 5520 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_lookupflag_f1.otfbin0 -> 5544 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f1.otfbin0 -> 5616 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f2.otfbin0 -> 5616 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_next_glyph_f1.otfbin0 -> 5560 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_simple_f1.otfbin0 -> 5508 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_simple_f2.otfbin0 -> 5512 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining1_successive_f1.otfbin0 -> 5544 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_boundary_f1.otfbin0 -> 5724 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_boundary_f2.otfbin0 -> 5728 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_boundary_f3.otfbin0 -> 5728 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_boundary_f4.otfbin0 -> 5728 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_lookupflag_f1.otfbin0 -> 5752 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f1.otfbin0 -> 5824 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f2.otfbin0 -> 5824 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_next_glyph_f1.otfbin0 -> 5764 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_simple_f1.otfbin0 -> 5716 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_simple_f2.otfbin0 -> 5720 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining2_successive_f1.otfbin0 -> 5752 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_boundary_f1.otfbin0 -> 5528 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_boundary_f2.otfbin0 -> 5532 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_boundary_f3.otfbin0 -> 5524 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_boundary_f4.otfbin0 -> 5524 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_lookupflag_f1.otfbin0 -> 5572 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_next_glyph_f1.otfbin0 -> 5548 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_simple_f1.otfbin0 -> 5520 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_simple_f2.otfbin0 -> 5540 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_chaining3_successive_f1.otfbin0 -> 5568 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_boundary_f1.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_boundary_f2.otfbin0 -> 5504 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_expansion_f1.otfbin0 -> 5516 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_lookupflag_f1.otfbin0 -> 5532 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_lookupflag_f2.otfbin0 -> 5524 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f1.otfbin0 -> 5592 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f2.otfbin0 -> 5592 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_next_glyph_f1.otfbin0 -> 5520 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_simple_f1.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_simple_f2.otfbin0 -> 5492 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context1_successive_f1.otfbin0 -> 5528 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_boundary_f1.otfbin0 -> 5516 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_boundary_f2.otfbin0 -> 5516 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_classes_f1.otfbin0 -> 5564 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_classes_f2.otfbin0 -> 5584 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_expansion_f1.otfbin0 -> 5544 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_lookupflag_f1.otfbin0 -> 5560 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_lookupflag_f2.otfbin0 -> 5552 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f1.otfbin0 -> 5620 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f2.otfbin0 -> 5620 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_next_glyph_f1.otfbin0 -> 5536 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_simple_f1.otfbin0 -> 5528 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_simple_f2.otfbin0 -> 5504 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context2_successive_f1.otfbin0 -> 5568 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context3_boundary_f1.otfbin0 -> 5500 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context3_boundary_f2.otfbin0 -> 5496 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context3_lookupflag_f1.otfbin0 -> 5536 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context3_lookupflag_f2.otfbin0 -> 5528 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context3_next_glyph_f1.otfbin0 -> 5520 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context3_simple_f1.otfbin0 -> 5504 bytes
-rw-r--r--test/shaping/data/aots/fonts/gsub_context3_successive_f1.otfbin0 -> 5540 bytes
-rw-r--r--test/shaping/data/aots/fonts/lookupflag_ignore_attach_f1.otfbin0 -> 5416 bytes
-rw-r--r--test/shaping/data/aots/fonts/lookupflag_ignore_base_f1.otfbin0 -> 5256 bytes
-rw-r--r--test/shaping/data/aots/fonts/lookupflag_ignore_combination_f1.otfbin0 -> 5408 bytes
-rw-r--r--test/shaping/data/aots/fonts/lookupflag_ignore_ligatures_f1.otfbin0 -> 5320 bytes
-rw-r--r--test/shaping/data/aots/fonts/lookupflag_ignore_marks_f1.otfbin0 -> 5288 bytes
-rw-r--r--test/shaping/data/aots/hb-aots-tester.cpp343
-rw-r--r--test/shaping/data/aots/tests/classdef1.tests1
-rw-r--r--test/shaping/data/aots/tests/classdef1_empty.tests1
-rw-r--r--test/shaping/data/aots/tests/classdef1_multiple.tests1
-rw-r--r--test/shaping/data/aots/tests/classdef1_single.tests1
-rw-r--r--test/shaping/data/aots/tests/classdef2.tests1
-rw-r--r--test/shaping/data/aots/tests/classdef2_empty.tests1
-rw-r--r--test/shaping/data/aots/tests/classdef2_multiple.tests1
-rw-r--r--test/shaping/data/aots/tests/classdef2_single.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos1_1_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos1_1_simple.tests4
-rw-r--r--test/shaping/data/aots/tests/gpos1_2.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos1_2_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos2_1.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos2_1_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos2_1_next_glyph.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos2_1_simple.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos2_2.tests5
-rw-r--r--test/shaping/data/aots/tests/gpos3.tests11
-rw-r--r--test/shaping/data/aots/tests/gpos3_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos4_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos4_multiple_anchors.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos4_simple.tests5
-rw-r--r--test/shaping/data/aots/tests/gpos5.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos6.tests3
-rw-r--r--test/shaping/data/aots/tests/gpos7_1.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos9.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining1_boundary.tests4
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining1_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining1_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining1_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining1_simple.tests11
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining1_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining2_boundary.tests4
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining2_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining2_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining2_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining2_simple.tests11
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining2_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining3_boundary.tests4
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining3_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining3_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining3_simple.tests11
-rw-r--r--test/shaping/data/aots/tests/gpos_chaining3_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context1_boundary.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context1_expansion.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context1_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context1_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context1_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context1_simple.tests3
-rw-r--r--test/shaping/data/aots/tests/gpos_context1_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_boundary.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_classes.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_expansion.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_simple.tests3
-rw-r--r--test/shaping/data/aots/tests/gpos_context2_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context3_boundary.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context3_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context3_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gpos_context3_simple.tests2
-rw-r--r--test/shaping/data/aots/tests/gpos_context3_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub1_1_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub1_1_modulo.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub1_1_simple.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub1_2_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub1_2_simple.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub2_1_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub2_1_multiple_sequences.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub2_1_simple.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub3_1_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub3_1_multiple.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub3_1_simple.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub4_1_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub4_1_multiple_ligatures.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub4_1_multiple_ligsets.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub4_1_simple.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub7.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining1_boundary.tests4
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining1_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining1_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining1_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining1_simple.tests11
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining1_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining2_boundary.tests4
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining2_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining2_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining2_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining2_simple.tests11
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining2_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining3_boundary.tests4
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining3_lookupflag.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining3_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining3_simple.tests11
-rw-r--r--test/shaping/data/aots/tests/gsub_chaining3_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context1_boundary.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context1_expansion.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context1_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context1_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context1_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context1_simple.tests3
-rw-r--r--test/shaping/data/aots/tests/gsub_context1_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_boundary.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_classes.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_expansion.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_multiple_subrules.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_simple.tests3
-rw-r--r--test/shaping/data/aots/tests/gsub_context2_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context3_boundary.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context3_lookupflag.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context3_next_glyph.tests1
-rw-r--r--test/shaping/data/aots/tests/gsub_context3_simple.tests2
-rw-r--r--test/shaping/data/aots/tests/gsub_context3_successive.tests1
-rw-r--r--test/shaping/data/aots/tests/lookupflag_ignore_attach.tests5
-rw-r--r--test/shaping/data/aots/tests/lookupflag_ignore_base.tests2
-rw-r--r--test/shaping/data/aots/tests/lookupflag_ignore_combination.tests3
-rw-r--r--test/shaping/data/aots/tests/lookupflag_ignore_ligatures.tests3
-rw-r--r--test/shaping/data/aots/tests/lookupflag_ignore_marks.tests1
-rwxr-xr-xtest/shaping/run-tests.py9
331 files changed, 814 insertions, 3 deletions
diff --git a/test/shaping/CMakeLists.txt b/test/shaping/CMakeLists.txt
index 25f14177..8e33edee 100644
--- a/test/shaping/CMakeLists.txt
+++ b/test/shaping/CMakeLists.txt
@@ -5,7 +5,16 @@ if (HB_BUILD_UTILS)
add_test (NAME ${test}
COMMAND "${PYTHON_EXECUTABLE}" run-tests.py $<TARGET_FILE:hb-shape> "data/in-house/${test}"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
- set_property(TEST ${test} PROPERTY SKIP_RETURN_CODE 77)
+ set_property (TEST ${test} PROPERTY SKIP_RETURN_CODE 77)
+ endforeach ()
+
+ file (READ "${CMAKE_CURRENT_SOURCE_DIR}/data/aots/Makefile.sources" INHOUSE)
+ extract_make_variable (TESTS ${INHOUSE})
+ foreach (test IN ITEMS ${TESTS})
+ add_test (NAME ${test}
+ COMMAND "${PYTHON_EXECUTABLE}" run-tests.py $<TARGET_FILE:hb-shape> "data/aots/${test}"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+ set_property (TEST ${test} PROPERTY SKIP_RETURN_CODE 77)
endforeach ()
file (READ "${CMAKE_CURRENT_SOURCE_DIR}/data/text-rendering-tests/Makefile.sources" TEXTRENDERING)
@@ -14,6 +23,6 @@ if (HB_BUILD_UTILS)
add_test (NAME ${test}
COMMAND "${PYTHON_EXECUTABLE}" run-tests.py $<TARGET_FILE:hb-shape> "data/text-rendering-tests/${test}"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
- set_property(TEST ${test} PROPERTY SKIP_RETURN_CODE 77)
+ set_property (TEST ${test} PROPERTY SKIP_RETURN_CODE 77)
endforeach ()
endif ()
diff --git a/test/shaping/data/Makefile.am b/test/shaping/data/Makefile.am
index 4f2c1136..2b908b3c 100644
--- a/test/shaping/data/Makefile.am
+++ b/test/shaping/data/Makefile.am
@@ -3,6 +3,7 @@
NULL =
SUBDIRS = \
in-house \
+ aots \
text-rendering-tests \
$(NULL)
diff --git a/test/shaping/data/aots/COPYING b/test/shaping/data/aots/COPYING
new file mode 100644
index 00000000..d000f23b
--- /dev/null
+++ b/test/shaping/data/aots/COPYING
@@ -0,0 +1,13 @@
+Copyright 2000-2016 Adobe Systems Incorporated. All Rights Reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use these files except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/test/shaping/data/aots/Makefile.am b/test/shaping/data/aots/Makefile.am
new file mode 100644
index 00000000..3b1faee5
--- /dev/null
+++ b/test/shaping/data/aots/Makefile.am
@@ -0,0 +1,37 @@
+# Process this file with automake to produce Makefile.in
+
+NULL =
+
+# Convenience targets:
+lib:
+ @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
+EXTRA_DIST = \
+ COPYING \
+ fonts \
+ $(TESTS) \
+ $(NULL)
+
+TEST_EXTENSIONS = .tests
+TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
+
+init-aots:
+ git clone https://github.com/adobe-type-tools/aots $(srcdir)/aots
+ make -C$(srcdir)/aots
+ make -C$(srcdir)/aots/harfbuzz
+ touch $(srcdir)/init-aots
+
+update-tests: init-aots lib
+ cp $(srcdir)/hb-aots-tester.cpp $(srcdir)/aots/harfbuzz/hb-aots-tester.cpp
+ $(CXX) -Wno-narrowing $(srcdir)/aots/harfbuzz/hb-aots-tester.cpp \
+ -I$(top_srcdir)/src/ -o $(srcdir)/aots/harfbuzz/aots \
+ -L$(top_builddir)/src/.libs -lharfbuzz
+ rm -rf $(srcdir)/tests/
+ mkdir $(srcdir)/tests/
+ export LD_LIBRARY_PATH=$(realpath $(top_builddir)/src/.libs); cd $(srcdir)/aots/harfbuzz; ./aots
+
+.PHONY: update-tests
+
+include Makefile.sources
+
+-include $(top_srcdir)/git.mk
diff --git a/test/shaping/data/aots/Makefile.sources b/test/shaping/data/aots/Makefile.sources
new file mode 100644
index 00000000..8340bb6c
--- /dev/null
+++ b/test/shaping/data/aots/Makefile.sources
@@ -0,0 +1,126 @@
+TESTS = \
+ tests/classdef1_single.tests \
+ tests/classdef1.tests \
+ tests/classdef2_empty.tests \
+ tests/classdef2_single.tests \
+ tests/classdef2.tests \
+ tests/gpos1_1_lookupflag.tests \
+ tests/gpos1_1_simple.tests \
+ tests/gpos1_2_lookupflag.tests \
+ tests/gpos1_2.tests \
+ tests/gpos2_1_lookupflag.tests \
+ tests/gpos2_1_next_glyph.tests \
+ tests/gpos2_1_simple.tests \
+ tests/gpos2_1.tests \
+ tests/gpos2_2.tests \
+ tests/gpos4_lookupflag.tests \
+ tests/gpos7_1.tests \
+ tests/gpos9.tests \
+ tests/gpos_chaining1_boundary.tests \
+ tests/gpos_chaining1_lookupflag.tests \
+ tests/gpos_chaining1_multiple_subrules.tests \
+ tests/gpos_chaining1_next_glyph.tests \
+ tests/gpos_chaining1_simple.tests \
+ tests/gpos_chaining1_successive.tests \
+ tests/gpos_chaining2_boundary.tests \
+ tests/gpos_chaining2_lookupflag.tests \
+ tests/gpos_chaining2_multiple_subrules.tests \
+ tests/gpos_chaining2_next_glyph.tests \
+ tests/gpos_chaining2_simple.tests \
+ tests/gpos_chaining2_successive.tests \
+ tests/gpos_chaining3_boundary.tests \
+ tests/gpos_chaining3_lookupflag.tests \
+ tests/gpos_chaining3_next_glyph.tests \
+ tests/gpos_chaining3_simple.tests \
+ tests/gpos_chaining3_successive.tests \
+ tests/gpos_context1_boundary.tests \
+ tests/gpos_context1_expansion.tests \
+ tests/gpos_context1_lookupflag.tests \
+ tests/gpos_context1_multiple_subrules.tests \
+ tests/gpos_context1_next_glyph.tests \
+ tests/gpos_context1_simple.tests \
+ tests/gpos_context1_successive.tests \
+ tests/gpos_context2_boundary.tests \
+ tests/gpos_context2_classes.tests \
+ tests/gpos_context2_expansion.tests \
+ tests/gpos_context2_lookupflag.tests \
+ tests/gpos_context2_multiple_subrules.tests \
+ tests/gpos_context2_next_glyph.tests \
+ tests/gpos_context2_simple.tests \
+ tests/gpos_context2_successive.tests \
+ tests/gpos_context3_boundary.tests \
+ tests/gpos_context3_lookupflag.tests \
+ tests/gpos_context3_next_glyph.tests \
+ tests/gpos_context3_simple.tests \
+ tests/gpos_context3_successive.tests \
+ tests/gsub1_1_lookupflag.tests \
+ tests/gsub1_1_modulo.tests \
+ tests/gsub1_1_simple.tests \
+ tests/gsub1_2_lookupflag.tests \
+ tests/gsub1_2_simple.tests \
+ tests/gsub2_1_lookupflag.tests \
+ tests/gsub2_1_multiple_sequences.tests \
+ tests/gsub2_1_simple.tests \
+ tests/gsub3_1_lookupflag.tests \
+ tests/gsub3_1_multiple.tests \
+ tests/gsub4_1_lookupflag.tests \
+ tests/gsub4_1_multiple_ligatures.tests \
+ tests/gsub4_1_multiple_ligsets.tests \
+ tests/gsub4_1_simple.tests \
+ tests/gsub7.tests \
+ tests/gsub_chaining1_boundary.tests \
+ tests/gsub_chaining1_lookupflag.tests \
+ tests/gsub_chaining1_multiple_subrules.tests \
+ tests/gsub_chaining1_next_glyph.tests \
+ tests/gsub_chaining1_simple.tests \
+ tests/gsub_chaining1_successive.tests \
+ tests/gsub_chaining2_boundary.tests \
+ tests/gsub_chaining2_lookupflag.tests \
+ tests/gsub_chaining2_multiple_subrules.tests \
+ tests/gsub_chaining2_next_glyph.tests \
+ tests/gsub_chaining2_simple.tests \
+ tests/gsub_chaining2_successive.tests \
+ tests/gsub_chaining3_boundary.tests \
+ tests/gsub_chaining3_lookupflag.tests \
+ tests/gsub_chaining3_next_glyph.tests \
+ tests/gsub_chaining3_simple.tests \
+ tests/gsub_chaining3_successive.tests \
+ tests/gsub_context1_boundary.tests \
+ tests/gsub_context1_expansion.tests \
+ tests/gsub_context1_lookupflag.tests \
+ tests/gsub_context1_multiple_subrules.tests \
+ tests/gsub_context1_next_glyph.tests \
+ tests/gsub_context1_simple.tests \
+ tests/gsub_context1_successive.tests \
+ tests/gsub_context2_boundary.tests \
+ tests/gsub_context2_classes.tests \
+ tests/gsub_context2_expansion.tests \
+ tests/gsub_context2_lookupflag.tests \
+ tests/gsub_context2_multiple_subrules.tests \
+ tests/gsub_context2_next_glyph.tests \
+ tests/gsub_context2_simple.tests \
+ tests/gsub_context2_successive.tests \
+ tests/gsub_context3_boundary.tests \
+ tests/gsub_context3_lookupflag.tests \
+ tests/gsub_context3_next_glyph.tests \
+ tests/gsub_context3_simple.tests \
+ tests/gsub_context3_successive.tests \
+ tests/lookupflag_ignore_base.tests \
+ tests/lookupflag_ignore_combination.tests \
+ tests/lookupflag_ignore_ligatures.tests \
+ tests/lookupflag_ignore_marks.tests \
+ $(NULL)
+
+DISABLED_TESTS = \
+ tests/classdef1_empty.tests \
+ tests/classdef1_multiple.tests \
+ tests/classdef2_multiple.tests \
+ tests/gpos3_lookupflag.tests \
+ tests/gpos3.tests \
+ tests/gpos4_multiple_anchors.tests \
+ tests/gpos4_simple.tests \
+ tests/gpos5.tests \
+ tests/gpos6.tests \
+ tests/gsub3_1_simple.tests \
+ tests/lookupflag_ignore_attach.tests \
+ $(NULL)
diff --git a/test/shaping/data/aots/fonts/classdef1_font3.otf b/test/shaping/data/aots/fonts/classdef1_font3.otf
new file mode 100644
index 00000000..2a0f9cc8
--- /dev/null
+++ b/test/shaping/data/aots/fonts/classdef1_font3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/classdef1_font4.otf b/test/shaping/data/aots/fonts/classdef1_font4.otf
new file mode 100644
index 00000000..9c0f41c5
--- /dev/null
+++ b/test/shaping/data/aots/fonts/classdef1_font4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/classdef2_font1.otf b/test/shaping/data/aots/fonts/classdef2_font1.otf
new file mode 100644
index 00000000..2e2faafe
--- /dev/null
+++ b/test/shaping/data/aots/fonts/classdef2_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/classdef2_font2.otf b/test/shaping/data/aots/fonts/classdef2_font2.otf
new file mode 100644
index 00000000..2e2a1af7
--- /dev/null
+++ b/test/shaping/data/aots/fonts/classdef2_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/classdef2_font3.otf b/test/shaping/data/aots/fonts/classdef2_font3.otf
new file mode 100644
index 00000000..14c91193
--- /dev/null
+++ b/test/shaping/data/aots/fonts/classdef2_font3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/classdef2_font4.otf b/test/shaping/data/aots/fonts/classdef2_font4.otf
new file mode 100644
index 00000000..c75c883a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/classdef2_font4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap0_font1.otf b/test/shaping/data/aots/fonts/cmap0_font1.otf
new file mode 100644
index 00000000..772f9a74
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap0_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap10_font1.otf b/test/shaping/data/aots/fonts/cmap10_font1.otf
new file mode 100644
index 00000000..023e9456
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap10_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap10_font2.otf b/test/shaping/data/aots/fonts/cmap10_font2.otf
new file mode 100644
index 00000000..5202f794
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap10_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap12_font1.otf b/test/shaping/data/aots/fonts/cmap12_font1.otf
new file mode 100644
index 00000000..2d74b3a9
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap12_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap14_font1.otf b/test/shaping/data/aots/fonts/cmap14_font1.otf
new file mode 100644
index 00000000..a8e941d8
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap14_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap2_font1.otf b/test/shaping/data/aots/fonts/cmap2_font1.otf
new file mode 100644
index 00000000..a123d9ca
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap2_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap4_font1.otf b/test/shaping/data/aots/fonts/cmap4_font1.otf
new file mode 100644
index 00000000..516ed8e9
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap4_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap4_font2.otf b/test/shaping/data/aots/fonts/cmap4_font2.otf
new file mode 100644
index 00000000..0f678a3e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap4_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap4_font3.otf b/test/shaping/data/aots/fonts/cmap4_font3.otf
new file mode 100644
index 00000000..2034ecd4
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap4_font3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap4_font4.otf b/test/shaping/data/aots/fonts/cmap4_font4.otf
new file mode 100644
index 00000000..450508e3
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap4_font4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap6_font1.otf b/test/shaping/data/aots/fonts/cmap6_font1.otf
new file mode 100644
index 00000000..10b64a78
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap6_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap6_font2.otf b/test/shaping/data/aots/fonts/cmap6_font2.otf
new file mode 100644
index 00000000..2d2957fd
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap6_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap8_font1.otf b/test/shaping/data/aots/fonts/cmap8_font1.otf
new file mode 100644
index 00000000..791b9e35
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap8_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap_composition_font1.otf b/test/shaping/data/aots/fonts/cmap_composition_font1.otf
new file mode 100644
index 00000000..c7907173
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap_composition_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap_subtableselection_font1.otf b/test/shaping/data/aots/fonts/cmap_subtableselection_font1.otf
new file mode 100644
index 00000000..8929f8ab
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap_subtableselection_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap_subtableselection_font2.otf b/test/shaping/data/aots/fonts/cmap_subtableselection_font2.otf
new file mode 100644
index 00000000..26110921
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap_subtableselection_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap_subtableselection_font3.otf b/test/shaping/data/aots/fonts/cmap_subtableselection_font3.otf
new file mode 100644
index 00000000..9f393315
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap_subtableselection_font3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap_subtableselection_font4.otf b/test/shaping/data/aots/fonts/cmap_subtableselection_font4.otf
new file mode 100644
index 00000000..83ae88ef
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap_subtableselection_font4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/cmap_subtableselection_font5.otf b/test/shaping/data/aots/fonts/cmap_subtableselection_font5.otf
new file mode 100644
index 00000000..8b614ade
--- /dev/null
+++ b/test/shaping/data/aots/fonts/cmap_subtableselection_font5.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos1_1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos1_1_lookupflag_f1.otf
new file mode 100644
index 00000000..3245425d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos1_1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos1_1_simple_f1.otf b/test/shaping/data/aots/fonts/gpos1_1_simple_f1.otf
new file mode 100644
index 00000000..c5f88882
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos1_1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos1_1_simple_f2.otf b/test/shaping/data/aots/fonts/gpos1_1_simple_f2.otf
new file mode 100644
index 00000000..905d0a39
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos1_1_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos1_1_simple_f3.otf b/test/shaping/data/aots/fonts/gpos1_1_simple_f3.otf
new file mode 100644
index 00000000..550be87e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos1_1_simple_f3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos1_1_simple_f4.otf b/test/shaping/data/aots/fonts/gpos1_1_simple_f4.otf
new file mode 100644
index 00000000..448bc8b8
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos1_1_simple_f4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos1_2_font1.otf b/test/shaping/data/aots/fonts/gpos1_2_font1.otf
new file mode 100644
index 00000000..3e7b7bc4
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos1_2_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos1_2_font2.otf b/test/shaping/data/aots/fonts/gpos1_2_font2.otf
new file mode 100644
index 00000000..ba9d224f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos1_2_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_1_font6.otf b/test/shaping/data/aots/fonts/gpos2_1_font6.otf
new file mode 100644
index 00000000..cd4ea94c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_1_font6.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_1_font7.otf b/test/shaping/data/aots/fonts/gpos2_1_font7.otf
new file mode 100644
index 00000000..2871acc0
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_1_font7.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos2_1_lookupflag_f1.otf
new file mode 100644
index 00000000..60037824
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_1_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gpos2_1_lookupflag_f2.otf
new file mode 100644
index 00000000..9d0a273c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_1_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_1_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gpos2_1_next_glyph_f1.otf
new file mode 100644
index 00000000..64d6c2c9
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_1_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_1_next_glyph_f2.otf b/test/shaping/data/aots/fonts/gpos2_1_next_glyph_f2.otf
new file mode 100644
index 00000000..3d8c37ae
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_1_next_glyph_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_1_simple_f1.otf b/test/shaping/data/aots/fonts/gpos2_1_simple_f1.otf
new file mode 100644
index 00000000..c947776a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_2_font1.otf b/test/shaping/data/aots/fonts/gpos2_2_font1.otf
new file mode 100644
index 00000000..dde370a0
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_2_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_2_font2.otf b/test/shaping/data/aots/fonts/gpos2_2_font2.otf
new file mode 100644
index 00000000..63d874a2
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_2_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_2_font3.otf b/test/shaping/data/aots/fonts/gpos2_2_font3.otf
new file mode 100644
index 00000000..b5306764
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_2_font3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_2_font4.otf b/test/shaping/data/aots/fonts/gpos2_2_font4.otf
new file mode 100644
index 00000000..b549e023
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_2_font4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos2_2_font5.otf b/test/shaping/data/aots/fonts/gpos2_2_font5.otf
new file mode 100644
index 00000000..64c40bba
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos2_2_font5.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos3_font1.otf b/test/shaping/data/aots/fonts/gpos3_font1.otf
new file mode 100644
index 00000000..9b6d39ac
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos3_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos3_font2.otf b/test/shaping/data/aots/fonts/gpos3_font2.otf
new file mode 100644
index 00000000..dee57855
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos3_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos3_font3.otf b/test/shaping/data/aots/fonts/gpos3_font3.otf
new file mode 100644
index 00000000..7522660d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos3_font3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos4_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos4_lookupflag_f1.otf
new file mode 100644
index 00000000..b141116a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos4_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos4_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gpos4_lookupflag_f2.otf
new file mode 100644
index 00000000..84e48437
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos4_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos4_multiple_anchors_1.otf b/test/shaping/data/aots/fonts/gpos4_multiple_anchors_1.otf
new file mode 100644
index 00000000..025f69b3
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos4_multiple_anchors_1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos4_simple_1.otf b/test/shaping/data/aots/fonts/gpos4_simple_1.otf
new file mode 100644
index 00000000..da54a1fd
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos4_simple_1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos5_font1.otf b/test/shaping/data/aots/fonts/gpos5_font1.otf
new file mode 100644
index 00000000..8c48fb67
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos5_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos6_font1.otf b/test/shaping/data/aots/fonts/gpos6_font1.otf
new file mode 100644
index 00000000..f7f92cc3
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos6_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos7_1_font1.otf b/test/shaping/data/aots/fonts/gpos7_1_font1.otf
new file mode 100644
index 00000000..ced8907e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos7_1_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos9_font1.otf b/test/shaping/data/aots/fonts/gpos9_font1.otf
new file mode 100644
index 00000000..e99c25a0
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos9_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos9_font2.otf b/test/shaping/data/aots/fonts/gpos9_font2.otf
new file mode 100644
index 00000000..9ae824ba
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos9_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f1.otf
new file mode 100644
index 00000000..44c4117a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f2.otf
new file mode 100644
index 00000000..431b08fe
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f3.otf b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f3.otf
new file mode 100644
index 00000000..1bac49ab
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f4.otf b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f4.otf
new file mode 100644
index 00000000..3d377829
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining1_lookupflag_f1.otf
new file mode 100644
index 00000000..a83342a1
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f1.otf
new file mode 100644
index 00000000..07bf55c4
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f2.otf
new file mode 100644
index 00000000..dc3754b5
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining1_next_glyph_f1.otf
new file mode 100644
index 00000000..17852c2d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_simple_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining1_simple_f1.otf
new file mode 100644
index 00000000..31cbe77d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_simple_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining1_simple_f2.otf
new file mode 100644
index 00000000..3293ad8c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining1_successive_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining1_successive_f1.otf
new file mode 100644
index 00000000..4c866632
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining1_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f1.otf
new file mode 100644
index 00000000..49210fb9
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f2.otf
new file mode 100644
index 00000000..456fc9b6
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f3.otf b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f3.otf
new file mode 100644
index 00000000..768492a8
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f4.otf b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f4.otf
new file mode 100644
index 00000000..2670da65
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining2_lookupflag_f1.otf
new file mode 100644
index 00000000..e8cce567
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f1.otf
new file mode 100644
index 00000000..f182c7f3
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f2.otf
new file mode 100644
index 00000000..d24896a1
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining2_next_glyph_f1.otf
new file mode 100644
index 00000000..f6bbda47
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_simple_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining2_simple_f1.otf
new file mode 100644
index 00000000..1805a034
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_simple_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining2_simple_f2.otf
new file mode 100644
index 00000000..1df12f52
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining2_successive_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining2_successive_f1.otf
new file mode 100644
index 00000000..a3aadafb
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining2_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f1.otf
new file mode 100644
index 00000000..4f13bdd6
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f2.otf
new file mode 100644
index 00000000..48be5dda
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f3.otf b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f3.otf
new file mode 100644
index 00000000..a10068bb
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f4.otf b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f4.otf
new file mode 100644
index 00000000..8030ac0e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining3_lookupflag_f1.otf
new file mode 100644
index 00000000..7864ce02
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining3_next_glyph_f1.otf
new file mode 100644
index 00000000..20a7966c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_simple_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining3_simple_f1.otf
new file mode 100644
index 00000000..2c633280
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_simple_f2.otf b/test/shaping/data/aots/fonts/gpos_chaining3_simple_f2.otf
new file mode 100644
index 00000000..6ef8fb11
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_chaining3_successive_f1.otf b/test/shaping/data/aots/fonts/gpos_chaining3_successive_f1.otf
new file mode 100644
index 00000000..8e8439d9
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_chaining3_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_boundary_f1.otf b/test/shaping/data/aots/fonts/gpos_context1_boundary_f1.otf
new file mode 100644
index 00000000..22bb3eac
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_boundary_f2.otf b/test/shaping/data/aots/fonts/gpos_context1_boundary_f2.otf
new file mode 100644
index 00000000..7e4c0e19
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_expansion_f1.otf b/test/shaping/data/aots/fonts/gpos_context1_expansion_f1.otf
new file mode 100644
index 00000000..f7c60f68
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_expansion_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos_context1_lookupflag_f1.otf
new file mode 100644
index 00000000..e9b03ae1
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gpos_context1_lookupflag_f2.otf
new file mode 100644
index 00000000..b9998cd0
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f1.otf
new file mode 100644
index 00000000..6f1aafaa
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f2.otf
new file mode 100644
index 00000000..ed9a3876
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gpos_context1_next_glyph_f1.otf
new file mode 100644
index 00000000..6007d54c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_simple_f1.otf b/test/shaping/data/aots/fonts/gpos_context1_simple_f1.otf
new file mode 100644
index 00000000..5e6cd9ed
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_simple_f2.otf b/test/shaping/data/aots/fonts/gpos_context1_simple_f2.otf
new file mode 100644
index 00000000..b4fddb33
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context1_successive_f1.otf b/test/shaping/data/aots/fonts/gpos_context1_successive_f1.otf
new file mode 100644
index 00000000..eb0f962e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context1_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_boundary_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_boundary_f1.otf
new file mode 100644
index 00000000..3fce4970
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_boundary_f2.otf b/test/shaping/data/aots/fonts/gpos_context2_boundary_f2.otf
new file mode 100644
index 00000000..5b4e0123
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_classes_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_classes_f1.otf
new file mode 100644
index 00000000..585b511c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_classes_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_classes_f2.otf b/test/shaping/data/aots/fonts/gpos_context2_classes_f2.otf
new file mode 100644
index 00000000..411d58e6
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_classes_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_expansion_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_expansion_f1.otf
new file mode 100644
index 00000000..4b2d36ae
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_expansion_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_lookupflag_f1.otf
new file mode 100644
index 00000000..1c0c4808
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gpos_context2_lookupflag_f2.otf
new file mode 100644
index 00000000..bf20d846
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f1.otf
new file mode 100644
index 00000000..05b6b73c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f2.otf
new file mode 100644
index 00000000..f79712cc
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_next_glyph_f1.otf
new file mode 100644
index 00000000..1b5a256f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_simple_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_simple_f1.otf
new file mode 100644
index 00000000..9aaec44f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_simple_f2.otf b/test/shaping/data/aots/fonts/gpos_context2_simple_f2.otf
new file mode 100644
index 00000000..c789b2ef
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context2_successive_f1.otf b/test/shaping/data/aots/fonts/gpos_context2_successive_f1.otf
new file mode 100644
index 00000000..b89bfb7b
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context2_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context3_boundary_f1.otf b/test/shaping/data/aots/fonts/gpos_context3_boundary_f1.otf
new file mode 100644
index 00000000..f8949d47
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context3_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context3_boundary_f2.otf b/test/shaping/data/aots/fonts/gpos_context3_boundary_f2.otf
new file mode 100644
index 00000000..ceb7452a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context3_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context3_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gpos_context3_lookupflag_f1.otf
new file mode 100644
index 00000000..40b55ee0
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context3_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context3_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gpos_context3_lookupflag_f2.otf
new file mode 100644
index 00000000..bcf4d17e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context3_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context3_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gpos_context3_next_glyph_f1.otf
new file mode 100644
index 00000000..6f9d9197
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context3_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context3_simple_f1.otf b/test/shaping/data/aots/fonts/gpos_context3_simple_f1.otf
new file mode 100644
index 00000000..470c2ed3
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context3_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gpos_context3_successive_f1.otf b/test/shaping/data/aots/fonts/gpos_context3_successive_f1.otf
new file mode 100644
index 00000000..aeb9bbdf
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gpos_context3_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub1_1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub1_1_lookupflag_f1.otf
new file mode 100644
index 00000000..a539b95d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub1_1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub1_1_modulo_f1.otf b/test/shaping/data/aots/fonts/gsub1_1_modulo_f1.otf
new file mode 100644
index 00000000..7ba23792
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub1_1_modulo_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub1_1_simple_f1.otf b/test/shaping/data/aots/fonts/gsub1_1_simple_f1.otf
new file mode 100644
index 00000000..c21fcd3f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub1_1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub1_2_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub1_2_lookupflag_f1.otf
new file mode 100644
index 00000000..b13af6e7
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub1_2_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub1_2_simple_f1.otf b/test/shaping/data/aots/fonts/gsub1_2_simple_f1.otf
new file mode 100644
index 00000000..d3851b33
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub1_2_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub2_1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub2_1_lookupflag_f1.otf
new file mode 100644
index 00000000..8330ad4c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub2_1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub2_1_multiple_sequences_f1.otf b/test/shaping/data/aots/fonts/gsub2_1_multiple_sequences_f1.otf
new file mode 100644
index 00000000..c912937e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub2_1_multiple_sequences_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub2_1_simple_f1.otf b/test/shaping/data/aots/fonts/gsub2_1_simple_f1.otf
new file mode 100644
index 00000000..584a7f55
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub2_1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub3_1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub3_1_lookupflag_f1.otf
new file mode 100644
index 00000000..4ccf55f4
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub3_1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub3_1_multiple_f1.otf b/test/shaping/data/aots/fonts/gsub3_1_multiple_f1.otf
new file mode 100644
index 00000000..075f1962
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub3_1_multiple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub3_1_simple_f1.otf b/test/shaping/data/aots/fonts/gsub3_1_simple_f1.otf
new file mode 100644
index 00000000..201f0f23
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub3_1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub4_1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub4_1_lookupflag_f1.otf
new file mode 100644
index 00000000..08ec01a7
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub4_1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f1.otf b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f1.otf
new file mode 100644
index 00000000..90da3316
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f2.otf b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f2.otf
new file mode 100644
index 00000000..4383ba93
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub4_1_multiple_ligsets_f1.otf b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligsets_f1.otf
new file mode 100644
index 00000000..cea1b1ae
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligsets_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub4_1_simple_f1.otf b/test/shaping/data/aots/fonts/gsub4_1_simple_f1.otf
new file mode 100644
index 00000000..50c713a8
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub4_1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub7_font1.otf b/test/shaping/data/aots/fonts/gsub7_font1.otf
new file mode 100644
index 00000000..b920398a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub7_font1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub7_font2.otf b/test/shaping/data/aots/fonts/gsub7_font2.otf
new file mode 100644
index 00000000..c98bafb5
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub7_font2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f1.otf
new file mode 100644
index 00000000..444d9317
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f2.otf
new file mode 100644
index 00000000..2268647d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f3.otf b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f3.otf
new file mode 100644
index 00000000..a5929474
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f4.otf b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f4.otf
new file mode 100644
index 00000000..f3f6b8c2
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining1_lookupflag_f1.otf
new file mode 100644
index 00000000..47e4c64d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f1.otf
new file mode 100644
index 00000000..741362c8
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f2.otf
new file mode 100644
index 00000000..67801f21
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining1_next_glyph_f1.otf
new file mode 100644
index 00000000..655000aa
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_simple_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining1_simple_f1.otf
new file mode 100644
index 00000000..c7709656
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_simple_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining1_simple_f2.otf
new file mode 100644
index 00000000..8999e3f7
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining1_successive_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining1_successive_f1.otf
new file mode 100644
index 00000000..ad472ece
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining1_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f1.otf
new file mode 100644
index 00000000..845c2560
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f2.otf
new file mode 100644
index 00000000..af0ad1f7
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f3.otf b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f3.otf
new file mode 100644
index 00000000..28679c86
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f4.otf b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f4.otf
new file mode 100644
index 00000000..14746c6e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining2_lookupflag_f1.otf
new file mode 100644
index 00000000..2f4feedf
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f1.otf
new file mode 100644
index 00000000..6edeb6bb
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f2.otf
new file mode 100644
index 00000000..ae0298fd
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining2_next_glyph_f1.otf
new file mode 100644
index 00000000..878666f5
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_simple_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining2_simple_f1.otf
new file mode 100644
index 00000000..e8609309
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_simple_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining2_simple_f2.otf
new file mode 100644
index 00000000..4fdde332
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining2_successive_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining2_successive_f1.otf
new file mode 100644
index 00000000..90f9f731
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining2_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f1.otf
new file mode 100644
index 00000000..1aea8bee
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f2.otf
new file mode 100644
index 00000000..97c92c38
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f3.otf b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f3.otf
new file mode 100644
index 00000000..3b8513eb
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f3.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f4.otf b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f4.otf
new file mode 100644
index 00000000..e81d00ed
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f4.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining3_lookupflag_f1.otf
new file mode 100644
index 00000000..47c1007c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining3_next_glyph_f1.otf
new file mode 100644
index 00000000..9160eda2
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_simple_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining3_simple_f1.otf
new file mode 100644
index 00000000..5982eb51
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_simple_f2.otf b/test/shaping/data/aots/fonts/gsub_chaining3_simple_f2.otf
new file mode 100644
index 00000000..359b1260
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_chaining3_successive_f1.otf b/test/shaping/data/aots/fonts/gsub_chaining3_successive_f1.otf
new file mode 100644
index 00000000..ae39d920
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_chaining3_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_boundary_f1.otf b/test/shaping/data/aots/fonts/gsub_context1_boundary_f1.otf
new file mode 100644
index 00000000..0267cabf
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_boundary_f2.otf b/test/shaping/data/aots/fonts/gsub_context1_boundary_f2.otf
new file mode 100644
index 00000000..24b1716f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_expansion_f1.otf b/test/shaping/data/aots/fonts/gsub_context1_expansion_f1.otf
new file mode 100644
index 00000000..c1dda807
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_expansion_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub_context1_lookupflag_f1.otf
new file mode 100644
index 00000000..60676ab5
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gsub_context1_lookupflag_f2.otf
new file mode 100644
index 00000000..bcb56e41
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f1.otf
new file mode 100644
index 00000000..52cd8616
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f2.otf
new file mode 100644
index 00000000..891356a0
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gsub_context1_next_glyph_f1.otf
new file mode 100644
index 00000000..2786dedc
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_simple_f1.otf b/test/shaping/data/aots/fonts/gsub_context1_simple_f1.otf
new file mode 100644
index 00000000..ebdaf22a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_simple_f2.otf b/test/shaping/data/aots/fonts/gsub_context1_simple_f2.otf
new file mode 100644
index 00000000..d4a3fbfc
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context1_successive_f1.otf b/test/shaping/data/aots/fonts/gsub_context1_successive_f1.otf
new file mode 100644
index 00000000..ce2dce5d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context1_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_boundary_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_boundary_f1.otf
new file mode 100644
index 00000000..6f46192d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_boundary_f2.otf b/test/shaping/data/aots/fonts/gsub_context2_boundary_f2.otf
new file mode 100644
index 00000000..ef19d877
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_classes_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_classes_f1.otf
new file mode 100644
index 00000000..85077601
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_classes_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_classes_f2.otf b/test/shaping/data/aots/fonts/gsub_context2_classes_f2.otf
new file mode 100644
index 00000000..ceb74b2c
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_classes_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_expansion_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_expansion_f1.otf
new file mode 100644
index 00000000..c12f0ac7
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_expansion_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_lookupflag_f1.otf
new file mode 100644
index 00000000..a0fada4f
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gsub_context2_lookupflag_f2.otf
new file mode 100644
index 00000000..cd40a5d0
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f1.otf
new file mode 100644
index 00000000..53be20d5
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f2.otf b/test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f2.otf
new file mode 100644
index 00000000..6bcc0cb3
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_next_glyph_f1.otf
new file mode 100644
index 00000000..4ca4e489
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_simple_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_simple_f1.otf
new file mode 100644
index 00000000..16aae9d2
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_simple_f2.otf b/test/shaping/data/aots/fonts/gsub_context2_simple_f2.otf
new file mode 100644
index 00000000..fc31262e
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_simple_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context2_successive_f1.otf b/test/shaping/data/aots/fonts/gsub_context2_successive_f1.otf
new file mode 100644
index 00000000..cf1a89c1
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context2_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context3_boundary_f1.otf b/test/shaping/data/aots/fonts/gsub_context3_boundary_f1.otf
new file mode 100644
index 00000000..01cd29db
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context3_boundary_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context3_boundary_f2.otf b/test/shaping/data/aots/fonts/gsub_context3_boundary_f2.otf
new file mode 100644
index 00000000..6fa5f05a
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context3_boundary_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context3_lookupflag_f1.otf b/test/shaping/data/aots/fonts/gsub_context3_lookupflag_f1.otf
new file mode 100644
index 00000000..94371b4d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context3_lookupflag_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context3_lookupflag_f2.otf b/test/shaping/data/aots/fonts/gsub_context3_lookupflag_f2.otf
new file mode 100644
index 00000000..d8150df4
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context3_lookupflag_f2.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context3_next_glyph_f1.otf b/test/shaping/data/aots/fonts/gsub_context3_next_glyph_f1.otf
new file mode 100644
index 00000000..93533b81
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context3_next_glyph_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context3_simple_f1.otf b/test/shaping/data/aots/fonts/gsub_context3_simple_f1.otf
new file mode 100644
index 00000000..a1cd98c4
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context3_simple_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/gsub_context3_successive_f1.otf b/test/shaping/data/aots/fonts/gsub_context3_successive_f1.otf
new file mode 100644
index 00000000..d8b3d5cc
--- /dev/null
+++ b/test/shaping/data/aots/fonts/gsub_context3_successive_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/lookupflag_ignore_attach_f1.otf b/test/shaping/data/aots/fonts/lookupflag_ignore_attach_f1.otf
new file mode 100644
index 00000000..80651f1d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/lookupflag_ignore_attach_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/lookupflag_ignore_base_f1.otf b/test/shaping/data/aots/fonts/lookupflag_ignore_base_f1.otf
new file mode 100644
index 00000000..3c242b0d
--- /dev/null
+++ b/test/shaping/data/aots/fonts/lookupflag_ignore_base_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/lookupflag_ignore_combination_f1.otf b/test/shaping/data/aots/fonts/lookupflag_ignore_combination_f1.otf
new file mode 100644
index 00000000..b88359a8
--- /dev/null
+++ b/test/shaping/data/aots/fonts/lookupflag_ignore_combination_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/lookupflag_ignore_ligatures_f1.otf b/test/shaping/data/aots/fonts/lookupflag_ignore_ligatures_f1.otf
new file mode 100644
index 00000000..1dc0c237
--- /dev/null
+++ b/test/shaping/data/aots/fonts/lookupflag_ignore_ligatures_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/fonts/lookupflag_ignore_marks_f1.otf b/test/shaping/data/aots/fonts/lookupflag_ignore_marks_f1.otf
new file mode 100644
index 00000000..aa429de3
--- /dev/null
+++ b/test/shaping/data/aots/fonts/lookupflag_ignore_marks_f1.otf
Binary files differ
diff --git a/test/shaping/data/aots/hb-aots-tester.cpp b/test/shaping/data/aots/hb-aots-tester.cpp
new file mode 100644
index 00000000..81e30076
--- /dev/null
+++ b/test/shaping/data/aots/hb-aots-tester.cpp
@@ -0,0 +1,343 @@
+/*____________________________________________________________________________
+
+ Copyright 2000-2016 Adobe Systems Incorporated. All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use these files except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+____________________________________________________________________________*/
+
+#include "stdlib.h"
+#include "stdio.h"
+#include "string.h"
+#include "hb.h"
+#include "hb-ot.h"
+
+static const bool verbose = true;
+
+
+hb_feature_t *gFeatures;
+int gNbFeatures;
+
+ hb_buffer_t *runTest(const char *testName,
+ const char *fontfileName,
+ unsigned int *in, int nbIn,
+ unsigned int *select, int nbSelect)
+{
+ FILE *f = fopen (fontfileName, "rb");
+ fseek(f, 0, SEEK_END);
+ long fontsize = ftell(f);
+ fseek(f, 0, SEEK_SET);
+ char *fontdata = (char *)malloc (fontsize);
+ fread(fontdata, fontsize, 1, f);
+ fclose(f);
+
+ if (verbose) {
+ printf ("------------------------------- %s\n", testName);
+ }
+
+ // setup font
+ hb_blob_t *blob = hb_blob_create(fontdata, fontsize,
+ HB_MEMORY_MODE_WRITABLE,
+ 0, 0);
+ hb_face_t *face = hb_face_create(blob, 0);
+ hb_font_t *font = hb_font_create(face);
+ unsigned int upem = hb_face_get_upem (face);
+
+ hb_font_set_scale(font, upem, upem);
+ hb_ot_font_set_funcs (font);
+
+ // setup buffer
+ hb_buffer_t *buffer = hb_buffer_create();
+ hb_buffer_set_direction(buffer, HB_DIRECTION_LTR);
+ hb_buffer_set_script(buffer, HB_SCRIPT_LATIN);
+ hb_buffer_set_language(buffer, hb_language_from_string("en", 2));
+
+ hb_buffer_add_utf32(buffer, in, nbIn, 0, nbIn);
+
+ // setup features
+ hb_feature_t *features;
+ int nbFeatures;
+
+ if (nbSelect == 0)
+ {
+ nbFeatures = 1;
+
+ features = (hb_feature_t *) malloc (sizeof (*features));
+ features[0].tag = HB_TAG('t', 'e', 's', 't');
+ features[0].value = 1;
+ features[0].start = 0;
+ features[0].end = 0xffffffff;
+ }
+ else
+ {
+ nbFeatures = 0;
+
+ features = (hb_feature_t *) malloc (sizeof (*features) * nbSelect);
+ for (int i = 0; i < nbSelect; i++) {
+ if (select[i] != -1) {
+ features[nbFeatures].tag = HB_TAG('t', 'e', 's', 't');
+ features[nbFeatures].value = select[i];
+ features[nbFeatures].start = i;
+ features[nbFeatures].end = i + 1;
+ nbFeatures++;
+ }
+ }
+ }
+ gFeatures = features;
+ gNbFeatures = nbFeatures;
+
+ // shape
+ hb_shape(font, buffer, features, nbFeatures);
+
+ hb_blob_destroy(blob);
+ hb_font_destroy(font);
+ hb_face_destroy(face);
+ //free(features);
+
+ return buffer;
+}
+
+
+void printArray (const char* s, int *a, int n)
+{
+ printf ("%s %d : ", s, n);
+ for (int i = 0; i < n; i++) {
+ printf (" %d", a[i]);
+ }
+ printf ("\n");
+}
+
+void printUArray (const char* s, unsigned int *a, int n)
+{
+ printArray (s, (int *) a, n);
+}
+
+bool gsub_test(const char *testName,
+ const char *fontfileName,
+ int nbIn, unsigned int *in,
+ int nbSelect, unsigned int *select,
+ int nbExpected, unsigned int *expected)
+{
+ hb_buffer_t *buffer = runTest(testName,
+ fontfileName,
+ in, nbIn,
+ select, nbSelect);
+
+ // verify
+ hb_glyph_info_t *actual = hb_buffer_get_glyph_infos(buffer, 0);
+ unsigned int nbActual = hb_buffer_get_length(buffer);
+
+ bool ok = true;
+
+ if (nbActual != nbExpected)
+ ok = false;
+ else {
+ for (int i = 0; i < nbActual; i++) {
+ if (actual[i].codepoint != expected [i]) {
+ ok = false;
+ break;
+ }
+ }
+ }
+
+
+ char test_name[255];
+ sprintf (test_name, "../../tests/%.*s.tests", (int) (strrchr (testName, '_') - testName), testName);
+ FILE *tests_file = fopen (test_name, "a+");
+ fprintf (tests_file, "../fonts/%s:--features=\"", fontfileName + 9);
+ for (unsigned int i = 0; i < gNbFeatures; i++)
+ {
+ if (i != 0) fprintf (tests_file, ",");
+ char buf[255];
+ hb_feature_to_string (&gFeatures[i], buf, sizeof (buf));
+ fprintf (tests_file, "%s", buf);
+ }
+ free (gFeatures);
+ fprintf (tests_file, "\" --no-clusters --no-glyph-names --no-positions:");
+
+ for (unsigned int i = 0; i < nbIn; i++)
+ {
+ if (i != 0) fprintf (tests_file, ",");
+ fprintf (tests_file, "U+%04X", in[i]);
+ }
+
+ fprintf (tests_file, ":[");
+ for (unsigned int i = 0; i < nbActual; i++)
+ {
+ if (i != 0) fprintf (tests_file, "|");
+ fprintf (tests_file, "%d", expected[i]);
+ }
+ fprintf (tests_file, "]");
+
+ fprintf (tests_file, "\n");
+ fclose (tests_file);
+
+
+ if (! ok) {
+ printf ("******* GSUB %s\n", testName);
+
+ printf ("expected %d:", nbExpected);
+ for (int i = 0; i < nbExpected; i++) {
+ printf (" %d", expected[i]); }
+ printf ("\n");
+
+ printf (" actual %d:", nbActual);
+ for (int i = 0; i < nbActual; i++) {
+ printf (" %d", actual[i].codepoint); }
+ printf ("\n");
+
+ }
+
+ hb_buffer_destroy(buffer);
+
+ return ok;
+}
+
+bool gpos_test(const char *testName,
+ const char *fontfileName,
+ int nbIn,
+ unsigned int *in,
+ int nbOut,
+ unsigned int *out,
+ int *x,
+ int *y)
+{
+ hb_buffer_t *buffer = runTest(testName,
+ fontfileName,
+ in, nbIn,
+ 0, 0);
+
+ // verify
+ unsigned int nbActual;
+ hb_glyph_info_t *actual = hb_buffer_get_glyph_infos(buffer, &nbActual);
+ hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, NULL);
+
+ unsigned int *actualG = (unsigned int *) malloc(sizeof(*actualG) * nbActual);
+ int *actualX = (int *) malloc(sizeof(*actualX) * nbActual);
+ int *actualY = (int *) malloc(sizeof(*actualY) * nbActual);
+ int curX = 0;
+ int curY = 0;
+ for (int i = 0; i < nbActual; i++) {
+ actualG[i] = actual[i].codepoint;
+ actualX[i] = curX + pos[i].x_offset;
+ actualY[i] = curY + pos[i].y_offset;
+
+ actualX[i] -= 1500 * i;
+
+ curX += pos[i].x_advance;
+ curY += pos[i].y_advance;
+ }
+
+ bool nbOk = true;
+ bool xOk = true;
+ bool yOk = true;
+
+ if (nbActual != nbOut)
+ nbOk = false;
+ else {
+ for (int i = 0; i < nbActual; i++) {
+ if (actualX[i] != x[i]) {
+ xOk = false;
+ }
+ if (actualY[i] != y[i]) {
+ yOk = false;
+ }
+ }
+ }
+
+ bool ok = (nbOk && xOk && yOk);
+ if (! ok) {
+ printf ("******* GPOS %s\n", testName);
+
+ if (! (nbOk && xOk)) {
+ printArray ("expectedX", x, nbOut);
+ printArray ("actualX ", actualX, nbActual);
+
+ printf ("xadv/pos:");
+ for (int i = 0; i < nbOut; i++) {
+ printf (" %d/%d", pos[i].x_advance, pos[i].x_offset);
+ }
+ printf ("\n");
+ }
+
+ if (! (nbOk && yOk)) {
+ printArray ("expectedY", y, nbOut);
+ printArray ("actualY ", actualY, nbActual);
+
+ printf ("yadv/pos:");
+ for (int i = 0; i < nbOut; i++) {
+ printf (" %d/%d", pos[i].y_advance, pos[i].y_offset);
+ }
+ printf ("\n");
+ }
+ }
+
+
+ char test_name[255];
+ sprintf (test_name, "../../tests/%.*s.tests", (int) (strrchr (testName, '_') - testName), testName);
+ FILE *tests_file = fopen (test_name, "a+");
+ if (!ok) fprintf (tests_file, "#");
+ fprintf (tests_file, "../fonts/%s:--features=\"", fontfileName + 9);
+ for (unsigned int i = 0; i < gNbFeatures; i++)
+ {
+ if (i != 0) fprintf (tests_file, ",");
+ char buf[255];
+ hb_feature_to_string (&gFeatures[i], buf, sizeof (buf));
+ fprintf (tests_file, "%s", buf);
+ }
+ free (gFeatures);
+ fprintf (tests_file, "\" --no-clusters --no-glyph-names --ned:");
+
+ for (unsigned int i = 0; i < nbIn; i++)
+ {
+ if (i != 0) fprintf (tests_file, ",");
+ fprintf (tests_file, "U+%04X", in[i]);
+ }
+
+ fprintf (tests_file, ":[");
+ for (unsigned int i = 0; i < nbActual; i++)
+ {
+ if (i != 0) fprintf (tests_file, "|");
+ fprintf (tests_file, "%d", /*it should be "out[i]"*/ actualG[i]);
+
+ int expected_x = x[i] + 1500*i;
+ int expected_y = y[i];
+ if (expected_x || expected_y) fprintf (tests_file, "@%d,%d", expected_x, expected_y);
+ }
+ fprintf (tests_file, "]");
+
+ fprintf (tests_file, "\n");
+ fclose (tests_file);
+
+
+ hb_buffer_destroy(buffer);
+
+ free(actualG);
+ free(actualX);
+ free(actualY);
+
+ return ok;
+}
+
+
+int main(int argc, char **argv)
+{
+ int failures = 0;
+ int pass = 0;
+
+#include "hb-aots-tester.h"
+
+ printf ("%d failures, %d pass\n", failures, pass);
+}
+
+
+
diff --git a/test/shaping/data/aots/tests/classdef1.tests b/test/shaping/data/aots/tests/classdef1.tests
new file mode 100644
index 00000000..40ded45e
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef1.tests
@@ -0,0 +1 @@
+../fonts/classdef1_font4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18|19|20|21]
diff --git a/test/shaping/data/aots/tests/classdef1_empty.tests b/test/shaping/data/aots/tests/classdef1_empty.tests
new file mode 100644
index 00000000..71d87f1c
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef1_empty.tests
@@ -0,0 +1 @@
+../fonts/classdef1_font2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|25|21]
diff --git a/test/shaping/data/aots/tests/classdef1_multiple.tests b/test/shaping/data/aots/tests/classdef1_multiple.tests
new file mode 100644
index 00000000..c813f494
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef1_multiple.tests
@@ -0,0 +1 @@
+../fonts/classdef1_font3.otf:--features="test" --no-clusters --no-glyph-names --no-positions: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+0020,U+0021,U+0022,U+0023,U+0024:[20|23|24|25|24|26|27|28|28|29|30|31|34|33|34|35|37|38|38|39]
diff --git a/test/shaping/data/aots/tests/classdef1_single.tests b/test/shaping/data/aots/tests/classdef1_single.tests
new file mode 100644
index 00000000..b0196d3f
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef1_single.tests
@@ -0,0 +1 @@
+../fonts/classdef2_font1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|25|21]
diff --git a/test/shaping/data/aots/tests/classdef2.tests b/test/shaping/data/aots/tests/classdef2.tests
new file mode 100644
index 00000000..d8c7b148
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef2.tests
@@ -0,0 +1 @@
+../fonts/classdef2_font4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18|19|20|21]
diff --git a/test/shaping/data/aots/tests/classdef2_empty.tests b/test/shaping/data/aots/tests/classdef2_empty.tests
new file mode 100644
index 00000000..a8fd6295
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef2_empty.tests
@@ -0,0 +1 @@
+../fonts/classdef2_font2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|25|21]
diff --git a/test/shaping/data/aots/tests/classdef2_multiple.tests b/test/shaping/data/aots/tests/classdef2_multiple.tests
new file mode 100644
index 00000000..39e68351
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef2_multiple.tests
@@ -0,0 +1 @@
+../fonts/classdef2_font3.otf:--features="test" --no-clusters --no-glyph-names --no-positions: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+0020,U+0021,U+0022,U+0023,U+0024:[20|23|24|25|24|26|27|28|28|29|30|31|34|33|34|35|37|38|38|39]
diff --git a/test/shaping/data/aots/tests/classdef2_single.tests b/test/shaping/data/aots/tests/classdef2_single.tests
new file mode 100644
index 00000000..b0196d3f
--- /dev/null
+++ b/test/shaping/data/aots/tests/classdef2_single.tests
@@ -0,0 +1 @@
+../fonts/classdef2_font1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|25|21]
diff --git a/test/shaping/data/aots/tests/gpos1_1_lookupflag.tests b/test/shaping/data/aots/tests/gpos1_1_lookupflag.tests
new file mode 100644
index 00000000..88d7dd74
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos1_1_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gpos1_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,0|19@3000,0|20@4200,0|21@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos1_1_simple.tests b/test/shaping/data/aots/tests/gpos1_1_simple.tests
new file mode 100644
index 00000000..101da9c4
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos1_1_simple.tests
@@ -0,0 +1,4 @@
+../fonts/gpos1_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1300,0|19@3000,0|20@4300,0|21@6000,0]
+../fonts/gpos1_1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,-200|19@3000,0|20@4500,-200|21@6000,0]
+../fonts/gpos1_1_simple_f3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,0|19@2800,0|20@4300,0|21@5600,0]
+#../fonts/gpos1_1_simple_f4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,0|19@3000,-200|20@4500,-200|21@6000,-400]
diff --git a/test/shaping/data/aots/tests/gpos1_2.tests b/test/shaping/data/aots/tests/gpos1_2.tests
new file mode 100644
index 00000000..3ddfa449
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos1_2.tests
@@ -0,0 +1 @@
+../fonts/gpos1_2_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1300,0|19@3000,0|20@4200,0|21@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos1_2_lookupflag.tests b/test/shaping/data/aots/tests/gpos1_2_lookupflag.tests
new file mode 100644
index 00000000..82bcc430
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos1_2_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gpos1_2_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1500,0|19@3000,0|20@4200,0|21@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos2_1.tests b/test/shaping/data/aots/tests/gpos2_1.tests
new file mode 100644
index 00000000..4d8b5e96
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos2_1.tests
@@ -0,0 +1,2 @@
+../fonts/gpos2_1_font6.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011,U+0012,U+0014,U+0011:[17|18@1300,0|19@3000,-100|17@4500,0|18@5700,0|20@7500,-400|17@9000,0]
+../fonts/gpos2_1_font7.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011,U+0012,U+0014,U+0011,U+0015,U+0016,U+0011:[17|18@1300,0|19@3000,-100|17@4500,0|18@5700,0|20@7500,-400|17@9000,0|21@10000,0|22@12000,-600|17@13500,0]
diff --git a/test/shaping/data/aots/tests/gpos2_1_lookupflag.tests b/test/shaping/data/aots/tests/gpos2_1_lookupflag.tests
new file mode 100644
index 00000000..ce445a11
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos2_1_lookupflag.tests
@@ -0,0 +1,2 @@
+../fonts/gpos2_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011:[17|19@1300,0|20@3000,-100|17@4500,0|19@5800,0|18@7500,0|20@9000,-100|17@10500,0]
+../fonts/gpos2_1_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011:[17|19@1500,0|20@2800,-100|17@4300,0|19@5800,0|18@7100,0|20@8600,-100|17@10100,0]
diff --git a/test/shaping/data/aots/tests/gpos2_1_next_glyph.tests b/test/shaping/data/aots/tests/gpos2_1_next_glyph.tests
new file mode 100644
index 00000000..7f27eeed
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos2_1_next_glyph.tests
@@ -0,0 +1,2 @@
+../fonts/gpos2_1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0012,U+0012,U+0012,U+0012:[18@-100,0|18@1500,-100|18@2900,0|18@4500,-100]
+../fonts/gpos2_1_next_glyph_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0012,U+0012,U+0012,U+0012:[18@-100,0|18@1400,0|18@2900,0|18@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos2_1_simple.tests b/test/shaping/data/aots/tests/gpos2_1_simple.tests
new file mode 100644
index 00000000..71e8c81e
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos2_1_simple.tests
@@ -0,0 +1,2 @@
+../fonts/gpos2_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011,U+0012,U+0014:[17|18@1300,0|19@3000,-100|17@4500,0|18@6000,0|20@7500,0]
+../fonts/gpos2_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012:[17|18@1500,0]
diff --git a/test/shaping/data/aots/tests/gpos2_2.tests b/test/shaping/data/aots/tests/gpos2_2.tests
new file mode 100644
index 00000000..7be07f7d
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos2_2.tests
@@ -0,0 +1,5 @@
+../fonts/gpos2_2_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011,U+0012,U+0014:[17|18@1300,0|19@3000,-100|17@4500,0|18@6000,0|20@7500,0]
+../fonts/gpos2_2_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011:[17|19@1300,0|20@3000,-100|17@4500,0|19@5800,0|18@7500,0|20@9000,-100|17@10500,0]
+../fonts/gpos2_2_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011,U+0013,U+0012,U+0014,U+0011:[17|19@1500,0|20@2800,-100|17@4300,0|19@5800,0|18@7100,0|20@8600,-100|17@10100,0]
+../fonts/gpos2_2_font4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0012,U+0012,U+0012,U+0012:[18@-100,0|18@1500,-100|18@2900,0|18@4500,-100]
+../fonts/gpos2_2_font5.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0012,U+0012,U+0012,U+0012:[18@-100,0|18@1400,0|18@2900,0|18@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos3.tests b/test/shaping/data/aots/tests/gpos3.tests
new file mode 100644
index 00000000..d6f37bff
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos3.tests
@@ -0,0 +1,11 @@
+#../fonts/gpos3_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@1599,99|17@4500,0]
+../fonts/gpos3_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0011,U+0013,U+0011:[17|18@1500,0|17@3000,0|19@4500,0|17@6000,0]
+#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0012,U+0011:[17|18@1500,0|18@1600,100|17@4500,0]
+#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@1599,99|17@4500,0]
+#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0014,U+0012,U+0011:[17|20@1500,0|18@1602,102|17@4500,0]
+#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0014,U+0013,U+0011:[17|20@1500,0|19@1601,101|17@4500,0]
+../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0014,U+0011:[17|18@1500,0|20@3000,0|17@4500,0]
+../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0012,U+0011:[17|19@1500,0|18@3000,0|17@4500,0]
+../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011:[17|19@1500,0|20@3000,0|17@4500,0]
+../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012:[17|18@1500,0]
+../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0015,U+0015,U+0015:[17|18@1500,0|21@3000,0|21@4500,0|21@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos3_lookupflag.tests b/test/shaping/data/aots/tests/gpos3_lookupflag.tests
new file mode 100644
index 00000000..13d593ca
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos3_lookupflag.tests
@@ -0,0 +1,2 @@
+#../fonts/gpos3_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0015,U+0013,U+0011:[17|18@1500,0|21@3000,0|19@1599,99|17@6000,0]
+#../fonts/gpos3_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0015,U+0015,U+0015,U+0013,U+0011:[17|18@1500,0|21@3000,0|21@4500,0|21@6000,0|19@1599,99|17@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos4_lookupflag.tests b/test/shaping/data/aots/tests/gpos4_lookupflag.tests
new file mode 100644
index 00000000..9d041bff
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos4_lookupflag.tests
@@ -0,0 +1,2 @@
+#../fonts/gpos4_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0011,U+0013,U+0011:[17|18@1500,0|17@3000,0|19@4500,0|17@6000,0]
+#../fonts/gpos4_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@3000,0|17@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos4_multiple_anchors.tests b/test/shaping/data/aots/tests/gpos4_multiple_anchors.tests
new file mode 100644
index 00000000..af9a1f5f
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos4_multiple_anchors.tests
@@ -0,0 +1 @@
+#../fonts/gpos4_multiple_anchors_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0015,U+0016,U+0012,U+0013,U+0014,U+0015,U+0016:[17|19@-100,-80|20@-91,-71|21@-102,-82|22@-93,-73|18@7500,0|19@7420,-60|20@7429,-51|21@7418,-62|22@7427,-53]
diff --git a/test/shaping/data/aots/tests/gpos4_simple.tests b/test/shaping/data/aots/tests/gpos4_simple.tests
new file mode 100644
index 00000000..5d605079
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos4_simple.tests
@@ -0,0 +1,5 @@
+#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@1400,-80|17@4500,0]
+#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0011,U+0013,U+0011:[17|17@1500,0|19@3000,0|17@4500,0]
+#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0019,U+0019,U+0013,U+0011:[25|25@1500,0|19@3000,0|17@4500,0]
+#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0013,U+0011:[17|18@1500,0|19@1400,-80|19@1400,-80|17@6000,0]
+#../fonts/gpos4_simple_1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0014,U+0013,U+0011:[17|18@1500,0|20@3000,0|19@1400,-80|17@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos5.tests b/test/shaping/data/aots/tests/gpos5.tests
new file mode 100644
index 00000000..a20a0b9e
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos5.tests
@@ -0,0 +1,2 @@
+#../fonts/gpos5_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+001E,U+0013,U+001F,U+0011:[17|18@1500,0|19@1400,-80|17@4500,0]
+#../fonts/gpos5_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+001E,U+001F,U+0013,U+0011:[17|18@1500,0|19@1401,-79|17@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos6.tests b/test/shaping/data/aots/tests/gpos6.tests
new file mode 100644
index 00000000..e5f9b3cd
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos6.tests
@@ -0,0 +1,3 @@
+#../fonts/gpos6_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|19@1400,-80|17@4500,0]
+#../fonts/gpos6_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0011,U+0013,U+0011:[17|17@1500,0|19@3000,0|17@4500,0]
+#../fonts/gpos6_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0014,U+0014,U+0013,U+0011:[20|20@1500,0|19@3000,0|17@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos7_1.tests b/test/shaping/data/aots/tests/gpos7_1.tests
new file mode 100644
index 00000000..954c8cbc
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos7_1.tests
@@ -0,0 +1,2 @@
+../fonts/gpos7_1_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1600,0|19@3200,0|20@4800,0|21@6000,0]
+../fonts/gpos7_1_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0011,U+0012,U+0013,U+0011:[17|18@1500,0|17@3000,0|18@4500,0|19@6000,0|17@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos9.tests b/test/shaping/data/aots/tests/gpos9.tests
new file mode 100644
index 00000000..cb203330
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos9.tests
@@ -0,0 +1,2 @@
+../fonts/gpos9_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18@1300,0|19@3000,0|20@4300,0|21@6000,0]
+../fonts/gpos9_font2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0014,U+0015,U+0011:[17|18@1300,0|19@2700,0|20@4300,0|21@5700,0|17@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_boundary.tests b/test/shaping/data/aots/tests/gpos_chaining1_boundary.tests
new file mode 100644
index 00000000..646ff2cf
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining1_boundary.tests
@@ -0,0 +1,4 @@
+../fonts/gpos_chaining1_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining1_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining1_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining1_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_lookupflag.tests b/test/shaping/data/aots/tests/gpos_chaining1_lookupflag.tests
new file mode 100644
index 00000000..d0e6e2e0
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining1_lookupflag.tests
@@ -0,0 +1 @@
+#../fonts/gpos_chaining1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20@1500,0|90@3000,0|21@4500,0|91@6000,0|22@7500,0|92@9000,0|23@10520,0|93@12000,0|94@13500,0|24@15000,0|90@16500,0|25@18000,0|91@19500,0|26@21000,0|0@22500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_multiple_subrules.tests b/test/shaping/data/aots/tests/gpos_chaining1_multiple_subrules.tests
new file mode 100644
index 00000000..51bbe03b
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining1_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_chaining1_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
+../fonts/gpos_chaining1_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_next_glyph.tests b/test/shaping/data/aots/tests/gpos_chaining1_next_glyph.tests
new file mode 100644
index 00000000..f8be4045
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining1_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gpos_chaining1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6020,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_simple.tests b/test/shaping/data/aots/tests/gpos_chaining1_simple.tests
new file mode 100644
index 00000000..37efa11f
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining1_simple.tests
@@ -0,0 +1,11 @@
+../fonts/gpos_chaining1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|0@10500,0|0@12000,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]
+../fonts/gpos_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016:[0|20@1500,0|21@3000,0|22@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining1_successive.tests b/test/shaping/data/aots/tests/gpos_chaining1_successive.tests
new file mode 100644
index 00000000..7a829cf7
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining1_successive.tests
@@ -0,0 +1 @@
+../fonts/gpos_chaining1_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_boundary.tests b/test/shaping/data/aots/tests/gpos_chaining2_boundary.tests
new file mode 100644
index 00000000..c35b8c77
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining2_boundary.tests
@@ -0,0 +1,4 @@
+../fonts/gpos_chaining2_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining2_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining2_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining2_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_lookupflag.tests b/test/shaping/data/aots/tests/gpos_chaining2_lookupflag.tests
new file mode 100644
index 00000000..8b50e149
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining2_lookupflag.tests
@@ -0,0 +1 @@
+#../fonts/gpos_chaining2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20@1500,0|90@3000,0|21@4500,0|91@6000,0|22@7500,0|92@9000,0|23@10520,0|93@12000,0|94@13500,0|24@15000,0|90@16500,0|25@18000,0|91@19500,0|26@21000,0|0@22500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_multiple_subrules.tests b/test/shaping/data/aots/tests/gpos_chaining2_multiple_subrules.tests
new file mode 100644
index 00000000..8ddc8b22
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining2_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_chaining2_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
+../fonts/gpos_chaining2_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|0@9000,0|20@10500,0|21@12000,0|22@13520,0|23@15000,0|0@16500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_next_glyph.tests b/test/shaping/data/aots/tests/gpos_chaining2_next_glyph.tests
new file mode 100644
index 00000000..34170f21
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining2_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gpos_chaining2_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6020,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_simple.tests b/test/shaping/data/aots/tests/gpos_chaining2_simple.tests
new file mode 100644
index 00000000..32fda1b5
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining2_simple.tests
@@ -0,0 +1,11 @@
+../fonts/gpos_chaining2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|0@10500,0|0@12000,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]
+../fonts/gpos_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016:[0|20@1500,0|21@3000,0|22@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining2_successive.tests b/test/shaping/data/aots/tests/gpos_chaining2_successive.tests
new file mode 100644
index 00000000..e930863c
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining2_successive.tests
@@ -0,0 +1 @@
+../fonts/gpos_chaining2_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_boundary.tests b/test/shaping/data/aots/tests/gpos_chaining3_boundary.tests
new file mode 100644
index 00000000..f74dedf6
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining3_boundary.tests
@@ -0,0 +1,4 @@
+../fonts/gpos_chaining3_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining3_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining3_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining3_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_lookupflag.tests b/test/shaping/data/aots/tests/gpos_chaining3_lookupflag.tests
new file mode 100644
index 00000000..0165fb59
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining3_lookupflag.tests
@@ -0,0 +1 @@
+#../fonts/gpos_chaining3_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20@1500,0|90@3000,0|21@4500,0|91@6000,0|22@7500,0|92@9000,0|23@10520,0|93@12000,0|94@13500,0|24@15000,0|90@16500,0|25@18000,0|91@19500,0|26@21000,0|0@22500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_next_glyph.tests b/test/shaping/data/aots/tests/gpos_chaining3_next_glyph.tests
new file mode 100644
index 00000000..614bc2ea
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining3_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gpos_chaining3_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0016,U+0015,U+0016,U+0015,U+0016,U+0015,U+0000:[0|22@1500,0|21@3020,0|22@4500,0|21@6020,0|22@7500,0|21@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_simple.tests b/test/shaping/data/aots/tests/gpos_chaining3_simple.tests
new file mode 100644
index 00000000..f5977c23
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining3_simple.tests
@@ -0,0 +1,11 @@
+../fonts/gpos_chaining3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4520,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|0@10500,0|0@12000,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0@1500,0|21@3000,0|22@4500,0|23@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22@1500,0|23@3000,0|24@4500,0|25@6000,0|26@7500,0|0@9000,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23@1500,0|24@3000,0|25@4500,0|26@6000,0|0@7500,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0|24@7500,0|25@9000,0|26@10500,0|0@12000,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20@1500,0|21@3000,0|22@4500,0|23@6000,0]
+../fonts/gpos_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016:[0|20@1500,0|21@3000,0|22@4500,0]
diff --git a/test/shaping/data/aots/tests/gpos_chaining3_successive.tests b/test/shaping/data/aots/tests/gpos_chaining3_successive.tests
new file mode 100644
index 00000000..fa5a50ca
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_chaining3_successive.tests
@@ -0,0 +1 @@
+../fonts/gpos_chaining3_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25@1500,0|20@3000,0|21@4520,0|22@6020,0|23@7500,0|24@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_boundary.tests b/test/shaping/data/aots/tests/gpos_context1_boundary.tests
new file mode 100644
index 00000000..1db8fef3
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context1_boundary.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_context1_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
+../fonts/gpos_context1_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_expansion.tests b/test/shaping/data/aots/tests/gpos_context1_expansion.tests
new file mode 100644
index 00000000..2fc54d54
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context1_expansion.tests
@@ -0,0 +1 @@
+../fonts/gpos_context1_expansion_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_lookupflag.tests b/test/shaping/data/aots/tests/gpos_context1_lookupflag.tests
new file mode 100644
index 00000000..9e8fcd6e
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context1_lookupflag.tests
@@ -0,0 +1,2 @@
+#../fonts/gpos_context1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1520,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9020,0|0@10500,0]
+#../fonts/gpos_context1_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1500,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_multiple_subrules.tests b/test/shaping/data/aots/tests/gpos_context1_multiple_subrules.tests
new file mode 100644
index 00000000..b994f04e
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context1_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_context1_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20@1520,0|21@3000,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
+../fonts/gpos_context1_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_next_glyph.tests b/test/shaping/data/aots/tests/gpos_context1_next_glyph.tests
new file mode 100644
index 00000000..e67d6358
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context1_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gpos_context1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_simple.tests b/test/shaping/data/aots/tests/gpos_context1_simple.tests
new file mode 100644
index 00000000..4a88e0ad
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context1_simple.tests
@@ -0,0 +1,3 @@
+../fonts/gpos_context1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]
+../fonts/gpos_context1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000:[0|20@1500,0|0@3000,0|20@4500,0|21@6000,0|0@7500,0]
+../fonts/gpos_context1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3020,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context1_successive.tests b/test/shaping/data/aots/tests/gpos_context1_successive.tests
new file mode 100644
index 00000000..172d3504
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context1_successive.tests
@@ -0,0 +1 @@
+../fonts/gpos_context1_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_boundary.tests b/test/shaping/data/aots/tests/gpos_context2_boundary.tests
new file mode 100644
index 00000000..ef63fbbb
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_boundary.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_context2_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
+../fonts/gpos_context2_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_classes.tests b/test/shaping/data/aots/tests/gpos_context2_classes.tests
new file mode 100644
index 00000000..5a3d008a
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_classes.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_context2_classes_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+001A,U+001C,U+0018,U+0000,U+0015,U+001B,U+001A,U+0018,U+0000,U+0016,U+001B,U+001A,U+0018:[0|20@1500,0|26@3020,0|28@4500,0|24@6000,0|0@7500,0|21@9000,0|27@10520,0|26@12000,0|24@13500,0|0@15000,0|22@16500,0|27@18000,0|26@19500,0|24@21000,0]
+../fonts/gpos_context2_classes_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0016,U+001B,U+001A,U+0018,U+0000,U+0018,U+0018,U+001D,U+0016,U+0000,U+0016,U+001B,U+001A,U+0018:[0|22@1500,0|27@3020,0|26@4500,0|24@6000,0|0@7500,0|24@9000,0|24@10500,0|29@12020,0|22@13500,0|0@15000,0|22@16500,0|27@18020,0|26@19500,0|24@21000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_expansion.tests b/test/shaping/data/aots/tests/gpos_context2_expansion.tests
new file mode 100644
index 00000000..67ed9786
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_expansion.tests
@@ -0,0 +1 @@
+../fonts/gpos_context2_expansion_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1500,0|21@3000,0|22@4500,0|0@6000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_lookupflag.tests b/test/shaping/data/aots/tests/gpos_context2_lookupflag.tests
new file mode 100644
index 00000000..f48e8250
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_lookupflag.tests
@@ -0,0 +1,2 @@
+#../fonts/gpos_context2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1520,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9020,0|0@10500,0]
+#../fonts/gpos_context2_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1500,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_multiple_subrules.tests b/test/shaping/data/aots/tests/gpos_context2_multiple_subrules.tests
new file mode 100644
index 00000000..44893723
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_context2_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20@1520,0|21@3000,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
+../fonts/gpos_context2_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20@1500,0|21@3020,0|22@4500,0|0@6000,0|20@7500,0|21@9020,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_next_glyph.tests b/test/shaping/data/aots/tests/gpos_context2_next_glyph.tests
new file mode 100644
index 00000000..e736b3bd
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gpos_context2_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_simple.tests b/test/shaping/data/aots/tests/gpos_context2_simple.tests
new file mode 100644
index 00000000..edbc0be3
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_simple.tests
@@ -0,0 +1,3 @@
+../fonts/gpos_context2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]
+../fonts/gpos_context2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000:[0|20@1500,0|0@3000,0|20@4500,0|21@6000,0|0@7500,0]
+../fonts/gpos_context2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3020,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context2_successive.tests b/test/shaping/data/aots/tests/gpos_context2_successive.tests
new file mode 100644
index 00000000..8b098d59
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context2_successive.tests
@@ -0,0 +1 @@
+../fonts/gpos_context2_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_boundary.tests b/test/shaping/data/aots/tests/gpos_context3_boundary.tests
new file mode 100644
index 00000000..de3c0574
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context3_boundary.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_context3_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1500,0|20@3000,0|20@4500,0|20@6000,0|20@7500,0|0@9000,0]
+../fonts/gpos_context3_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3020,0|20@4520,0|20@6020,0|20@7520,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_lookupflag.tests b/test/shaping/data/aots/tests/gpos_context3_lookupflag.tests
new file mode 100644
index 00000000..21f851b9
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context3_lookupflag.tests
@@ -0,0 +1,2 @@
+#../fonts/gpos_context3_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1520,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9020,0|0@10500,0]
+#../fonts/gpos_context3_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20@1500,0|90@3000,0|21@4520,0|91@6000,0|92@7500,0|22@9000,0|0@10500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_next_glyph.tests b/test/shaping/data/aots/tests/gpos_context3_next_glyph.tests
new file mode 100644
index 00000000..049b156a
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context3_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gpos_context3_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20@1520,0|20@3000,0|20@4520,0|20@6000,0|20@7500,0|0@9000,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_simple.tests b/test/shaping/data/aots/tests/gpos_context3_simple.tests
new file mode 100644
index 00000000..3e544f04
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context3_simple.tests
@@ -0,0 +1,2 @@
+../fonts/gpos_context3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1520,0|21@3020,0|22@4520,0|0@6000,0]
+../fonts/gpos_context3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000,U+0014,U+0015,U+0016,U+0000:[0|20@1500,0|0@3000,0|20@4500,0|21@6000,0|0@7500,0|20@9020,0|21@10520,0|22@12020,0|0@13500,0]
diff --git a/test/shaping/data/aots/tests/gpos_context3_successive.tests b/test/shaping/data/aots/tests/gpos_context3_successive.tests
new file mode 100644
index 00000000..bfcf24ac
--- /dev/null
+++ b/test/shaping/data/aots/tests/gpos_context3_successive.tests
@@ -0,0 +1 @@
+../fonts/gpos_context3_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20@1500,0|21@3020,0|22@4520,0|23@6000,0|0@7500,0]
diff --git a/test/shaping/data/aots/tests/gsub1_1_lookupflag.tests b/test/shaping/data/aots/tests/gsub1_1_lookupflag.tests
new file mode 100644
index 00000000..8865af8c
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub1_1_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub1_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18|24|20|21]
diff --git a/test/shaping/data/aots/tests/gsub1_1_modulo.tests b/test/shaping/data/aots/tests/gsub1_1_modulo.tests
new file mode 100644
index 00000000..bbfff5ee
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub1_1_modulo.tests
@@ -0,0 +1 @@
+../fonts/gsub1_1_modulo_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015,U+0016,U+0017,U+0018:[17|18|17|24|23|18|23|24]
diff --git a/test/shaping/data/aots/tests/gsub1_1_simple.tests b/test/shaping/data/aots/tests/gsub1_1_simple.tests
new file mode 100644
index 00000000..a3a13859
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub1_1_simple.tests
@@ -0,0 +1 @@
+../fonts/gsub1_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|20|21]
diff --git a/test/shaping/data/aots/tests/gsub1_2_lookupflag.tests b/test/shaping/data/aots/tests/gsub1_2_lookupflag.tests
new file mode 100644
index 00000000..887e0479
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub1_2_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub1_2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|18|19|25|21]
diff --git a/test/shaping/data/aots/tests/gsub1_2_simple.tests b/test/shaping/data/aots/tests/gsub1_2_simple.tests
new file mode 100644
index 00000000..d6578973
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub1_2_simple.tests
@@ -0,0 +1 @@
+../fonts/gsub1_2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|22|19|25|21]
diff --git a/test/shaping/data/aots/tests/gsub2_1_lookupflag.tests b/test/shaping/data/aots/tests/gsub2_1_lookupflag.tests
new file mode 100644
index 00000000..e28e59cd
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub2_1_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub2_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0011:[17|18|22|23|17]
diff --git a/test/shaping/data/aots/tests/gsub2_1_multiple_sequences.tests b/test/shaping/data/aots/tests/gsub2_1_multiple_sequences.tests
new file mode 100644
index 00000000..12cbbf60
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub2_1_multiple_sequences.tests
@@ -0,0 +1 @@
+../fonts/gsub2_1_multiple_sequences_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0011:[17|20|21|22|23|17]
diff --git a/test/shaping/data/aots/tests/gsub2_1_simple.tests b/test/shaping/data/aots/tests/gsub2_1_simple.tests
new file mode 100644
index 00000000..d1d09690
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub2_1_simple.tests
@@ -0,0 +1,2 @@
+../fonts/gsub2_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013:[17|20|21|22|19]
+../fonts/gsub2_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0012:[17|20|21|22|19|20|21|22]
diff --git a/test/shaping/data/aots/tests/gsub3_1_lookupflag.tests b/test/shaping/data/aots/tests/gsub3_1_lookupflag.tests
new file mode 100644
index 00000000..193c5c4a
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub3_1_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub3_1_lookupflag_f1.otf:--features="-test[4],test[5],test[6]=2,-test[7]" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0012,U+0012,U+0013,U+0013,U+0013,U+0013,U+0011:[17|18|18|18|19|22|23|19|17]
diff --git a/test/shaping/data/aots/tests/gsub3_1_multiple.tests b/test/shaping/data/aots/tests/gsub3_1_multiple.tests
new file mode 100644
index 00000000..7b1c032e
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub3_1_multiple.tests
@@ -0,0 +1 @@
+../fonts/gsub3_1_multiple_f1.otf:--features="-test[1],test[2],test[3]=2,-test[4],-test[5],test[6],test[7]=2,-test[8]" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0012,U+0012,U+0012,U+0013,U+0013,U+0013,U+0013,U+0011:[17|18|20|21|18|19|22|23|19|17]
diff --git a/test/shaping/data/aots/tests/gsub3_1_simple.tests b/test/shaping/data/aots/tests/gsub3_1_simple.tests
new file mode 100644
index 00000000..5e65ba05
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub3_1_simple.tests
@@ -0,0 +1 @@
+../fonts/gsub3_1_simple_f1.otf:--features="-test[1],test[3],test[5]=2,test[7]=3,-test[9],test[11]" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011,U+0012,U+0011:[17|18|17|20|17|21|17|22|17|18|17|20|17]
diff --git a/test/shaping/data/aots/tests/gsub4_1_lookupflag.tests b/test/shaping/data/aots/tests/gsub4_1_lookupflag.tests
new file mode 100644
index 00000000..c2c5242a
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub4_1_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub4_1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0018,U+0012,U+0018,U+0013,U+0018,U+0018,U+0014,U+0018,U+0011,U+0012,U+0013,U+0016,U+0014:[17|24|23|24|24|24|24|17|18|19|22|20]
diff --git a/test/shaping/data/aots/tests/gsub4_1_multiple_ligatures.tests b/test/shaping/data/aots/tests/gsub4_1_multiple_ligatures.tests
new file mode 100644
index 00000000..33c1a09f
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub4_1_multiple_ligatures.tests
@@ -0,0 +1,2 @@
+../fonts/gsub4_1_multiple_ligatures_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0011,U+0012,U+0013,U+0016,U+0014:[17|23|17|24|22|20]
+../fonts/gsub4_1_multiple_ligatures_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0011,U+0012,U+0013,U+0016,U+0014:[17|24|20|17|24|22|20]
diff --git a/test/shaping/data/aots/tests/gsub4_1_multiple_ligsets.tests b/test/shaping/data/aots/tests/gsub4_1_multiple_ligsets.tests
new file mode 100644
index 00000000..a63aeed4
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub4_1_multiple_ligsets.tests
@@ -0,0 +1 @@
+../fonts/gsub4_1_multiple_ligsets_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0015,U+0014,U+0013,U+0016:[17|23|21|24|22]
diff --git a/test/shaping/data/aots/tests/gsub4_1_simple.tests b/test/shaping/data/aots/tests/gsub4_1_simple.tests
new file mode 100644
index 00000000..aa4bb4b2
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub4_1_simple.tests
@@ -0,0 +1 @@
+../fonts/gsub4_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0011,U+0012,U+0013,U+0016,U+0014:[17|23|17|18|19|22|20]
diff --git a/test/shaping/data/aots/tests/gsub7.tests b/test/shaping/data/aots/tests/gsub7.tests
new file mode 100644
index 00000000..e95b1c78
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub7.tests
@@ -0,0 +1,2 @@
+../fonts/gsub7_font1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|24|20|21]
+../fonts/gsub7_font2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|29|20|21]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_boundary.tests b/test/shaping/data/aots/tests/gsub_chaining1_boundary.tests
new file mode 100644
index 00000000..6d99d974
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining1_boundary.tests
@@ -0,0 +1,4 @@
+../fonts/gsub_chaining1_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|22|23|0]
+../fonts/gsub_chaining1_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
+../fonts/gsub_chaining1_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
+../fonts/gsub_chaining1_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_lookupflag.tests b/test/shaping/data/aots/tests/gsub_chaining1_lookupflag.tests
new file mode 100644
index 00000000..7883c0a8
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining1_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_multiple_subrules.tests b/test/shaping/data/aots/tests/gsub_chaining1_multiple_subrules.tests
new file mode 100644
index 00000000..28a52250
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining1_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_chaining1_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|24|0|20|21|62|23|0]
+../fonts/gsub_chaining1_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|24|0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_next_glyph.tests b/test/shaping/data/aots/tests/gsub_chaining1_next_glyph.tests
new file mode 100644
index 00000000..82f9d95c
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining1_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|63|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_simple.tests b/test/shaping/data/aots/tests/gsub_chaining1_simple.tests
new file mode 100644
index 00000000..23e091f2
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining1_simple.tests
@@ -0,0 +1,11 @@
+../fonts/gsub_chaining1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|23|0]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20|21|62|23|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20|21|22|23|24|25|0|0]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20|21|22|23|24|25]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20|21|22|23|24]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0|21|22|23|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22|23|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20|21|22|0|24|25|26|0]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20|21|22|23]
+../fonts/gsub_chaining1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016:[0|20|21|22]
diff --git a/test/shaping/data/aots/tests/gsub_chaining1_successive.tests b/test/shaping/data/aots/tests/gsub_chaining1_successive.tests
new file mode 100644
index 00000000..ab3cfb1b
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining1_successive.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining1_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25|20|61|63|24|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_boundary.tests b/test/shaping/data/aots/tests/gsub_chaining2_boundary.tests
new file mode 100644
index 00000000..b06c620c
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining2_boundary.tests
@@ -0,0 +1,4 @@
+../fonts/gsub_chaining2_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|22|23|0]
+../fonts/gsub_chaining2_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
+../fonts/gsub_chaining2_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
+../fonts/gsub_chaining2_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_lookupflag.tests b/test/shaping/data/aots/tests/gsub_chaining2_lookupflag.tests
new file mode 100644
index 00000000..372b3436
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining2_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_multiple_subrules.tests b/test/shaping/data/aots/tests/gsub_chaining2_multiple_subrules.tests
new file mode 100644
index 00000000..e2fbb5cb
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining2_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_chaining2_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|24|0|20|21|62|23|0]
+../fonts/gsub_chaining2_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|24|0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_next_glyph.tests b/test/shaping/data/aots/tests/gsub_chaining2_next_glyph.tests
new file mode 100644
index 00000000..84c82522
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining2_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining2_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|63|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_simple.tests b/test/shaping/data/aots/tests/gsub_chaining2_simple.tests
new file mode 100644
index 00000000..53fa7e85
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining2_simple.tests
@@ -0,0 +1,11 @@
+../fonts/gsub_chaining2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|23|0]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20|21|62|23|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20|21|22|23|24|25|0|0]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20|21|22|23|24|25]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20|21|22|23|24]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0|21|22|23|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22|23|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20|21|22|0|24|25|26|0]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20|21|22|23]
+../fonts/gsub_chaining2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016:[0|20|21|22]
diff --git a/test/shaping/data/aots/tests/gsub_chaining2_successive.tests b/test/shaping/data/aots/tests/gsub_chaining2_successive.tests
new file mode 100644
index 00000000..71cbe0dd
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining2_successive.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining2_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25|20|61|63|24|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_boundary.tests b/test/shaping/data/aots/tests/gsub_chaining3_boundary.tests
new file mode 100644
index 00000000..c01dc4b0
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining3_boundary.tests
@@ -0,0 +1,4 @@
+../fonts/gsub_chaining3_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|22|23|0]
+../fonts/gsub_chaining3_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
+../fonts/gsub_chaining3_boundary_f3.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|22|23|0]
+../fonts/gsub_chaining3_boundary_f4.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|21|62|23|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_lookupflag.tests b/test/shaping/data/aots/tests/gsub_chaining3_lookupflag.tests
new file mode 100644
index 00000000..be2147bf
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining3_lookupflag.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining3_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+0016,U+005C,U+0017,U+005D,U+005E,U+0018,U+005A,U+0019,U+005B,U+001A,U+0000:[0|20|90|21|91|22|92|63|93|94|24|90|25|91|26|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_next_glyph.tests b/test/shaping/data/aots/tests/gsub_chaining3_next_glyph.tests
new file mode 100644
index 00000000..2493c1e9
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining3_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining3_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0016,U+0015,U+0016,U+0015,U+0016,U+0015,U+0000:[0|22|61|22|61|22|21|0]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_simple.tests b/test/shaping/data/aots/tests/gsub_chaining3_simple.tests
new file mode 100644
index 00000000..eb241678
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining3_simple.tests
@@ -0,0 +1,11 @@
+../fonts/gsub_chaining3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|62|23|0]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|20|21|62|23|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019,U+0000,U+0000:[0|20|21|22|23|24|25|0|0]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018,U+0019:[0|20|21|22|23|24|25]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0018:[0|20|21|22|23|24]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0000,U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[0|0|21|22|23|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0015,U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[21|22|23|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0016,U+0017,U+0018,U+0019,U+001A,U+0000:[22|23|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0018,U+0019,U+001A,U+0000:[0|20|21|22|0|24|25|26|0]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017:[0|20|21|22|23]
+../fonts/gsub_chaining3_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016:[0|20|21|22]
diff --git a/test/shaping/data/aots/tests/gsub_chaining3_successive.tests b/test/shaping/data/aots/tests/gsub_chaining3_successive.tests
new file mode 100644
index 00000000..edcade19
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_chaining3_successive.tests
@@ -0,0 +1 @@
+../fonts/gsub_chaining3_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0019,U+0014,U+0015,U+0016,U+0017,U+0018,U+0000:[0|25|20|61|63|24|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_boundary.tests b/test/shaping/data/aots/tests/gsub_context1_boundary.tests
new file mode 100644
index 00000000..9b118926
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context1_boundary.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context1_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|20|20|20|20|0]
+../fonts/gsub_context1_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|60|60|60|60|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_expansion.tests b/test/shaping/data/aots/tests/gsub_context1_expansion.tests
new file mode 100644
index 00000000..92714c5a
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context1_expansion.tests
@@ -0,0 +1 @@
+../fonts/gsub_context1_expansion_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20|61|62|63|22|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_lookupflag.tests b/test/shaping/data/aots/tests/gsub_context1_lookupflag.tests
new file mode 100644
index 00000000..c5d97605
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context1_lookupflag.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context1_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|60|90|61|91|92|62|0]
+../fonts/gsub_context1_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20|90|61|91|92|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_multiple_subrules.tests b/test/shaping/data/aots/tests/gsub_context1_multiple_subrules.tests
new file mode 100644
index 00000000..febc4190
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context1_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context1_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|60|21|22|0|20|61|0]
+../fonts/gsub_context1_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20|61|22|0|20|61|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_next_glyph.tests b/test/shaping/data/aots/tests/gsub_context1_next_glyph.tests
new file mode 100644
index 00000000..12414c34
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context1_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gsub_context1_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|20|60|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_simple.tests b/test/shaping/data/aots/tests/gsub_context1_simple.tests
new file mode 100644
index 00000000..44252ecc
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context1_simple.tests
@@ -0,0 +1,3 @@
+../fonts/gsub_context1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|60|61|62|0]
+../fonts/gsub_context1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000:[0|20|0|20|21|0]
+../fonts/gsub_context1_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|60|20|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context1_successive.tests b/test/shaping/data/aots/tests/gsub_context1_successive.tests
new file mode 100644
index 00000000..e68d6b29
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context1_successive.tests
@@ -0,0 +1 @@
+../fonts/gsub_context1_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|63|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_boundary.tests b/test/shaping/data/aots/tests/gsub_context2_boundary.tests
new file mode 100644
index 00000000..2054277e
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_boundary.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context2_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|20|20|20|20|0]
+../fonts/gsub_context2_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|60|60|60|60|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_classes.tests b/test/shaping/data/aots/tests/gsub_context2_classes.tests
new file mode 100644
index 00000000..2e44007e
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_classes.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context2_classes_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+001A,U+001C,U+0018,U+0000,U+0015,U+001B,U+001A,U+0018,U+0000,U+0016,U+001B,U+001A,U+0018:[0|20|66|28|24|0|21|67|26|24|0|22|27|26|24]
+../fonts/gsub_context2_classes_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0016,U+001B,U+001A,U+0018,U+0000,U+0018,U+0018,U+001D,U+0016,U+0000,U+0016,U+001B,U+001A,U+0018:[0|22|67|26|24|0|24|24|69|22|0|22|67|26|24]
diff --git a/test/shaping/data/aots/tests/gsub_context2_expansion.tests b/test/shaping/data/aots/tests/gsub_context2_expansion.tests
new file mode 100644
index 00000000..af0ce71c
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_expansion.tests
@@ -0,0 +1 @@
+../fonts/gsub_context2_expansion_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|20|61|62|63|22|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_lookupflag.tests b/test/shaping/data/aots/tests/gsub_context2_lookupflag.tests
new file mode 100644
index 00000000..ac419498
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_lookupflag.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context2_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|60|90|61|91|92|62|0]
+../fonts/gsub_context2_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20|90|61|91|92|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_multiple_subrules.tests b/test/shaping/data/aots/tests/gsub_context2_multiple_subrules.tests
new file mode 100644
index 00000000..75225cd2
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_multiple_subrules.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context2_multiple_subrules_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|60|21|22|0|20|61|0]
+../fonts/gsub_context2_multiple_subrules_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000,U+0014,U+0015,U+0000:[0|20|61|22|0|20|61|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_next_glyph.tests b/test/shaping/data/aots/tests/gsub_context2_next_glyph.tests
new file mode 100644
index 00000000..020d05fc
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gsub_context2_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|20|60|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_simple.tests b/test/shaping/data/aots/tests/gsub_context2_simple.tests
new file mode 100644
index 00000000..5863605a
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_simple.tests
@@ -0,0 +1,3 @@
+../fonts/gsub_context2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|60|61|62|0]
+../fonts/gsub_context2_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000:[0|20|0|20|21|0]
+../fonts/gsub_context2_simple_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|60|20|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context2_successive.tests b/test/shaping/data/aots/tests/gsub_context2_successive.tests
new file mode 100644
index 00000000..9aeeac71
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context2_successive.tests
@@ -0,0 +1 @@
+../fonts/gsub_context2_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|63|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_boundary.tests b/test/shaping/data/aots/tests/gsub_context3_boundary.tests
new file mode 100644
index 00000000..8b40afdc
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context3_boundary.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context3_boundary_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|20|20|20|20|20|0]
+../fonts/gsub_context3_boundary_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|60|60|60|60|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_lookupflag.tests b/test/shaping/data/aots/tests/gsub_context3_lookupflag.tests
new file mode 100644
index 00000000..03c0647e
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context3_lookupflag.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context3_lookupflag_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|60|90|61|91|92|62|0]
+../fonts/gsub_context3_lookupflag_f2.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+005A,U+0015,U+005B,U+005C,U+0016,U+0000:[0|20|90|61|91|92|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_next_glyph.tests b/test/shaping/data/aots/tests/gsub_context3_next_glyph.tests
new file mode 100644
index 00000000..b28381b9
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context3_next_glyph.tests
@@ -0,0 +1 @@
+../fonts/gsub_context3_next_glyph_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0014,U+0014,U+0014,U+0014,U+0000:[0|60|20|60|20|20|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_simple.tests b/test/shaping/data/aots/tests/gsub_context3_simple.tests
new file mode 100644
index 00000000..ec264eaa
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context3_simple.tests
@@ -0,0 +1,2 @@
+../fonts/gsub_context3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0000:[0|60|61|62|0]
+../fonts/gsub_context3_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0000,U+0014,U+0015,U+0000,U+0014,U+0015,U+0016,U+0000:[0|20|0|20|21|0|60|61|62|0]
diff --git a/test/shaping/data/aots/tests/gsub_context3_successive.tests b/test/shaping/data/aots/tests/gsub_context3_successive.tests
new file mode 100644
index 00000000..b987a61f
--- /dev/null
+++ b/test/shaping/data/aots/tests/gsub_context3_successive.tests
@@ -0,0 +1 @@
+../fonts/gsub_context3_successive_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0000,U+0014,U+0015,U+0016,U+0017,U+0000:[0|20|61|63|0]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_attach.tests b/test/shaping/data/aots/tests/lookupflag_ignore_attach.tests
new file mode 100644
index 00000000..6534fc09
--- /dev/null
+++ b/test/shaping/data/aots/tests/lookupflag_ignore_attach.tests
@@ -0,0 +1,5 @@
+../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+000D,U+001A,U+000A:[10|15|10]
+../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+0015,U+000D,U+0016,U+0017,U+001D,U+001A,U+000A:[10|15|21|22|23|29|10]
+../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+0015,U+000D,U+0016,U+001B,U+001A,U+000A:[10|11|21|13|22|27|26|10]
+../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+001B,U+000D,U+0016,U+0017,U+001A,U+000A:[10|11|27|13|22|23|26|10]
+../fonts/lookupflag_ignore_attach_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+000A,U+000B,U+001B,U+000D,U+000E,U+0017,U+001A,U+000A:[10|11|27|13|14|23|26|10]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_base.tests b/test/shaping/data/aots/tests/lookupflag_ignore_base.tests
new file mode 100644
index 00000000..5f0bfdbd
--- /dev/null
+++ b/test/shaping/data/aots/tests/lookupflag_ignore_base.tests
@@ -0,0 +1,2 @@
+../fonts/lookupflag_ignore_base_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0013,U+0014,U+0015:[17|23|21]
+../fonts/lookupflag_ignore_base_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+0018,U+0018,U+0013,U+0019,U+0014,U+0015:[17|23|24|24|25|21]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_combination.tests b/test/shaping/data/aots/tests/lookupflag_ignore_combination.tests
new file mode 100644
index 00000000..d34f16a1
--- /dev/null
+++ b/test/shaping/data/aots/tests/lookupflag_ignore_combination.tests
@@ -0,0 +1,3 @@
+../fonts/lookupflag_ignore_combination_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+0013,U+0014,U+0015:[17|23|26|21]
+../fonts/lookupflag_ignore_combination_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+0013,U+0018,U+001E,U+001F,U+0014,U+0015:[17|23|26|24|30|31|21]
+../fonts/lookupflag_ignore_combination_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+0013,U+0018,U+001E,U+0020,U+0014,U+0015:[17|18|26|19|24|30|32|20|21]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_ligatures.tests b/test/shaping/data/aots/tests/lookupflag_ignore_ligatures.tests
new file mode 100644
index 00000000..feb31d80
--- /dev/null
+++ b/test/shaping/data/aots/tests/lookupflag_ignore_ligatures.tests
@@ -0,0 +1,3 @@
+../fonts/lookupflag_ignore_ligatures_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+001B,U+0013,U+001B,U+0014,U+0015:[17|23|26|27|27|21]
+../fonts/lookupflag_ignore_ligatures_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+0018,U+0013,U+001B,U+0014,U+0015:[17|18|26|24|19|27|20|21]
+../fonts/lookupflag_ignore_ligatures_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001A,U+002A,U+0013,U+001B,U+0014,U+0015:[17|18|26|42|19|27|20|21]
diff --git a/test/shaping/data/aots/tests/lookupflag_ignore_marks.tests b/test/shaping/data/aots/tests/lookupflag_ignore_marks.tests
new file mode 100644
index 00000000..96265992
--- /dev/null
+++ b/test/shaping/data/aots/tests/lookupflag_ignore_marks.tests
@@ -0,0 +1 @@
+../fonts/lookupflag_ignore_marks_f1.otf:--features="test" --no-clusters --no-glyph-names --no-positions:U+0011,U+0012,U+001C,U+001D,U+0013,U+001D,U+0014,U+0015:[17|23|28|29|29|21]
diff --git a/test/shaping/run-tests.py b/test/shaping/run-tests.py
index 17e203c0..c22d45c4 100755
--- a/test/shaping/run-tests.py
+++ b/test/shaping/run-tests.py
@@ -27,6 +27,7 @@ process = subprocess.Popen ([hb_shape, '--batch'],
stdout=subprocess.PIPE,
stderr=sys.stdout)
+ran_once = False
fails = 0
skips = 0
@@ -94,6 +95,8 @@ for filename in args:
fontfile] + extra_options + ["--unicodes",
unicodes] + (options.split (' ') if options else []))
+ ran_once = True
+
if glyphs1 != glyphs2 and glyphs_expected != '*':
print ("FT funcs: " + glyphs1) # file=sys.stderr
print ("OT funcs: " + glyphs2) # file=sys.stderr
@@ -115,5 +118,9 @@ if fails != 0 or skips != 0:
sys.exit (1)
sys.exit (77)
else:
- if not reference:
+ if not ran_once:
+ if not reference:
+ print ("No tests ran.")
+ sys.exit (77)
+ elif not reference:
print ("All tests passed.")