[HarfBuzz] harfbuzz: Branch 'master' - 3 commits

Behdad Esfahbod behdad at kemper.freedesktop.org
Sat Nov 24 19:53:13 UTC 2018


 configure.ac                                                         |    1 
 src/hb-aat-layout-kerx-table.hh                                      |    6 
 src/hb-aat-layout-morx-table.hh                                      |    4 
 test/shaping/CMakeLists.txt                                          |   13 
 test/shaping/data/Makefile.am                                        |    1 
 test/shaping/data/aots/COPYING                                       |   13 
 test/shaping/data/aots/Makefile.am                                   |   37 +
 test/shaping/data/aots/Makefile.sources                              |  126 +++
 test/shaping/data/aots/fonts/classdef1_font3.otf                     |binary
 test/shaping/data/aots/fonts/classdef1_font4.otf                     |binary
 test/shaping/data/aots/fonts/classdef2_font1.otf                     |binary
 test/shaping/data/aots/fonts/classdef2_font2.otf                     |binary
 test/shaping/data/aots/fonts/classdef2_font3.otf                     |binary
 test/shaping/data/aots/fonts/classdef2_font4.otf                     |binary
 test/shaping/data/aots/fonts/cmap0_font1.otf                         |binary
 test/shaping/data/aots/fonts/cmap10_font1.otf                        |binary
 test/shaping/data/aots/fonts/cmap10_font2.otf                        |binary
 test/shaping/data/aots/fonts/cmap12_font1.otf                        |binary
 test/shaping/data/aots/fonts/cmap14_font1.otf                        |binary
 test/shaping/data/aots/fonts/cmap2_font1.otf                         |binary
 test/shaping/data/aots/fonts/cmap4_font1.otf                         |binary
 test/shaping/data/aots/fonts/cmap4_font2.otf                         |binary
 test/shaping/data/aots/fonts/cmap4_font3.otf                         |binary
 test/shaping/data/aots/fonts/cmap4_font4.otf                         |binary
 test/shaping/data/aots/fonts/cmap6_font1.otf                         |binary
 test/shaping/data/aots/fonts/cmap6_font2.otf                         |binary
 test/shaping/data/aots/fonts/cmap8_font1.otf                         |binary
 test/shaping/data/aots/fonts/cmap_composition_font1.otf              |binary
 test/shaping/data/aots/fonts/cmap_subtableselection_font1.otf        |binary
 test/shaping/data/aots/fonts/cmap_subtableselection_font2.otf        |binary
 test/shaping/data/aots/fonts/cmap_subtableselection_font3.otf        |binary
 test/shaping/data/aots/fonts/cmap_subtableselection_font4.otf        |binary
 test/shaping/data/aots/fonts/cmap_subtableselection_font5.otf        |binary
 test/shaping/data/aots/fonts/gpos1_1_lookupflag_f1.otf               |binary
 test/shaping/data/aots/fonts/gpos1_1_simple_f1.otf                   |binary
 test/shaping/data/aots/fonts/gpos1_1_simple_f2.otf                   |binary
 test/shaping/data/aots/fonts/gpos1_1_simple_f3.otf                   |binary
 test/shaping/data/aots/fonts/gpos1_1_simple_f4.otf                   |binary
 test/shaping/data/aots/fonts/gpos1_2_font1.otf                       |binary
 test/shaping/data/aots/fonts/gpos1_2_font2.otf                       |binary
 test/shaping/data/aots/fonts/gpos2_1_font6.otf                       |binary
 test/shaping/data/aots/fonts/gpos2_1_font7.otf                       |binary
 test/shaping/data/aots/fonts/gpos2_1_lookupflag_f1.otf               |binary
 test/shaping/data/aots/fonts/gpos2_1_lookupflag_f2.otf               |binary
 test/shaping/data/aots/fonts/gpos2_1_next_glyph_f1.otf               |binary
 test/shaping/data/aots/fonts/gpos2_1_next_glyph_f2.otf               |binary
 test/shaping/data/aots/fonts/gpos2_1_simple_f1.otf                   |binary
 test/shaping/data/aots/fonts/gpos2_2_font1.otf                       |binary
 test/shaping/data/aots/fonts/gpos2_2_font2.otf                       |binary
 test/shaping/data/aots/fonts/gpos2_2_font3.otf                       |binary
 test/shaping/data/aots/fonts/gpos2_2_font4.otf                       |binary
 test/shaping/data/aots/fonts/gpos2_2_font5.otf                       |binary
 test/shaping/data/aots/fonts/gpos3_font1.otf                         |binary
 test/shaping/data/aots/fonts/gpos3_font2.otf                         |binary
 test/shaping/data/aots/fonts/gpos3_font3.otf                         |binary
 test/shaping/data/aots/fonts/gpos4_lookupflag_f1.otf                 |binary
 test/shaping/data/aots/fonts/gpos4_lookupflag_f2.otf                 |binary
 test/shaping/data/aots/fonts/gpos4_multiple_anchors_1.otf            |binary
 test/shaping/data/aots/fonts/gpos4_simple_1.otf                      |binary
 test/shaping/data/aots/fonts/gpos5_font1.otf                         |binary
 test/shaping/data/aots/fonts/gpos6_font1.otf                         |binary
 test/shaping/data/aots/fonts/gpos7_1_font1.otf                       |binary
 test/shaping/data/aots/fonts/gpos9_font1.otf                         |binary
 test/shaping/data/aots/fonts/gpos9_font2.otf                         |binary
 test/shaping/data/aots/fonts/gpos_chaining1_boundary_f1.otf          |binary
 test/shaping/data/aots/fonts/gpos_chaining1_boundary_f2.otf          |binary
 test/shaping/data/aots/fonts/gpos_chaining1_boundary_f3.otf          |binary
 test/shaping/data/aots/fonts/gpos_chaining1_boundary_f4.otf          |binary
 test/shaping/data/aots/fonts/gpos_chaining1_lookupflag_f1.otf        |binary
 test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f1.otf |binary
 test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f2.otf |binary
 test/shaping/data/aots/fonts/gpos_chaining1_next_glyph_f1.otf        |binary
 test/shaping/data/aots/fonts/gpos_chaining1_simple_f1.otf            |binary
 test/shaping/data/aots/fonts/gpos_chaining1_simple_f2.otf            |binary
 test/shaping/data/aots/fonts/gpos_chaining1_successive_f1.otf        |binary
 test/shaping/data/aots/fonts/gpos_chaining2_boundary_f1.otf          |binary
 test/shaping/data/aots/fonts/gpos_chaining2_boundary_f2.otf          |binary
 test/shaping/data/aots/fonts/gpos_chaining2_boundary_f3.otf          |binary
 test/shaping/data/aots/fonts/gpos_chaining2_boundary_f4.otf          |binary
 test/shaping/data/aots/fonts/gpos_chaining2_lookupflag_f1.otf        |binary
 test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f1.otf |binary
 test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f2.otf |binary
 test/shaping/data/aots/fonts/gpos_chaining2_next_glyph_f1.otf        |binary
 test/shaping/data/aots/fonts/gpos_chaining2_simple_f1.otf            |binary
 test/shaping/data/aots/fonts/gpos_chaining2_simple_f2.otf            |binary
 test/shaping/data/aots/fonts/gpos_chaining2_successive_f1.otf        |binary
 test/shaping/data/aots/fonts/gpos_chaining3_boundary_f1.otf          |binary
 test/shaping/data/aots/fonts/gpos_chaining3_boundary_f2.otf          |binary
 test/shaping/data/aots/fonts/gpos_chaining3_boundary_f3.otf          |binary
 test/shaping/data/aots/fonts/gpos_chaining3_boundary_f4.otf          |binary
 test/shaping/data/aots/fonts/gpos_chaining3_lookupflag_f1.otf        |binary
 test/shaping/data/aots/fonts/gpos_chaining3_next_glyph_f1.otf        |binary
 test/shaping/data/aots/fonts/gpos_chaining3_simple_f1.otf            |binary
 test/shaping/data/aots/fonts/gpos_chaining3_simple_f2.otf            |binary
 test/shaping/data/aots/fonts/gpos_chaining3_successive_f1.otf        |binary
 test/shaping/data/aots/fonts/gpos_context1_boundary_f1.otf           |binary
 test/shaping/data/aots/fonts/gpos_context1_boundary_f2.otf           |binary
 test/shaping/data/aots/fonts/gpos_context1_expansion_f1.otf          |binary
 test/shaping/data/aots/fonts/gpos_context1_lookupflag_f1.otf         |binary
 test/shaping/data/aots/fonts/gpos_context1_lookupflag_f2.otf         |binary
 test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f1.otf  |binary
 test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f2.otf  |binary
 test/shaping/data/aots/fonts/gpos_context1_next_glyph_f1.otf         |binary
 test/shaping/data/aots/fonts/gpos_context1_simple_f1.otf             |binary
 test/shaping/data/aots/fonts/gpos_context1_simple_f2.otf             |binary
 test/shaping/data/aots/fonts/gpos_context1_successive_f1.otf         |binary
 test/shaping/data/aots/fonts/gpos_context2_boundary_f1.otf           |binary
 test/shaping/data/aots/fonts/gpos_context2_boundary_f2.otf           |binary
 test/shaping/data/aots/fonts/gpos_context2_classes_f1.otf            |binary
 test/shaping/data/aots/fonts/gpos_context2_classes_f2.otf            |binary
 test/shaping/data/aots/fonts/gpos_context2_expansion_f1.otf          |binary
 test/shaping/data/aots/fonts/gpos_context2_lookupflag_f1.otf         |binary
 test/shaping/data/aots/fonts/gpos_context2_lookupflag_f2.otf         |binary
 test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f1.otf  |binary
 test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f2.otf  |binary
 test/shaping/data/aots/fonts/gpos_context2_next_glyph_f1.otf         |binary
 test/shaping/data/aots/fonts/gpos_context2_simple_f1.otf             |binary
 test/shaping/data/aots/fonts/gpos_context2_simple_f2.otf             |binary
 test/shaping/data/aots/fonts/gpos_context2_successive_f1.otf         |binary
 test/shaping/data/aots/fonts/gpos_context3_boundary_f1.otf           |binary
 test/shaping/data/aots/fonts/gpos_context3_boundary_f2.otf           |binary
 test/shaping/data/aots/fonts/gpos_context3_lookupflag_f1.otf         |binary
 test/shaping/data/aots/fonts/gpos_context3_lookupflag_f2.otf         |binary
 test/shaping/data/aots/fonts/gpos_context3_next_glyph_f1.otf         |binary
 test/shaping/data/aots/fonts/gpos_context3_simple_f1.otf             |binary
 test/shaping/data/aots/fonts/gpos_context3_successive_f1.otf         |binary
 test/shaping/data/aots/fonts/gsub1_1_lookupflag_f1.otf               |binary
 test/shaping/data/aots/fonts/gsub1_1_modulo_f1.otf                   |binary
 test/shaping/data/aots/fonts/gsub1_1_simple_f1.otf                   |binary
 test/shaping/data/aots/fonts/gsub1_2_lookupflag_f1.otf               |binary
 test/shaping/data/aots/fonts/gsub1_2_simple_f1.otf                   |binary
 test/shaping/data/aots/fonts/gsub2_1_lookupflag_f1.otf               |binary
 test/shaping/data/aots/fonts/gsub2_1_multiple_sequences_f1.otf       |binary
 test/shaping/data/aots/fonts/gsub2_1_simple_f1.otf                   |binary
 test/shaping/data/aots/fonts/gsub3_1_lookupflag_f1.otf               |binary
 test/shaping/data/aots/fonts/gsub3_1_multiple_f1.otf                 |binary
 test/shaping/data/aots/fonts/gsub3_1_simple_f1.otf                   |binary
 test/shaping/data/aots/fonts/gsub4_1_lookupflag_f1.otf               |binary
 test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f1.otf       |binary
 test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f2.otf       |binary
 test/shaping/data/aots/fonts/gsub4_1_multiple_ligsets_f1.otf         |binary
 test/shaping/data/aots/fonts/gsub4_1_simple_f1.otf                   |binary
 test/shaping/data/aots/fonts/gsub7_font1.otf                         |binary
 test/shaping/data/aots/fonts/gsub7_font2.otf                         |binary
 test/shaping/data/aots/fonts/gsub_chaining1_boundary_f1.otf          |binary
 test/shaping/data/aots/fonts/gsub_chaining1_boundary_f2.otf          |binary
 test/shaping/data/aots/fonts/gsub_chaining1_boundary_f3.otf          |binary
 test/shaping/data/aots/fonts/gsub_chaining1_boundary_f4.otf          |binary
 test/shaping/data/aots/fonts/gsub_chaining1_lookupflag_f1.otf        |binary
 test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f1.otf |binary
 test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f2.otf |binary
 test/shaping/data/aots/fonts/gsub_chaining1_next_glyph_f1.otf        |binary
 test/shaping/data/aots/fonts/gsub_chaining1_simple_f1.otf            |binary
 test/shaping/data/aots/fonts/gsub_chaining1_simple_f2.otf            |binary
 test/shaping/data/aots/fonts/gsub_chaining1_successive_f1.otf        |binary
 test/shaping/data/aots/fonts/gsub_chaining2_boundary_f1.otf          |binary
 test/shaping/data/aots/fonts/gsub_chaining2_boundary_f2.otf          |binary
 test/shaping/data/aots/fonts/gsub_chaining2_boundary_f3.otf          |binary
 test/shaping/data/aots/fonts/gsub_chaining2_boundary_f4.otf          |binary
 test/shaping/data/aots/fonts/gsub_chaining2_lookupflag_f1.otf        |binary
 test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f1.otf |binary
 test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f2.otf |binary
 test/shaping/data/aots/fonts/gsub_chaining2_next_glyph_f1.otf        |binary
 test/shaping/data/aots/fonts/gsub_chaining2_simple_f1.otf            |binary
 test/shaping/data/aots/fonts/gsub_chaining2_simple_f2.otf            |binary
 test/shaping/data/aots/fonts/gsub_chaining2_successive_f1.otf        |binary
 test/shaping/data/aots/fonts/gsub_chaining3_boundary_f1.otf          |binary
 test/shaping/data/aots/fonts/gsub_chaining3_boundary_f2.otf          |binary
 test/shaping/data/aots/fonts/gsub_chaining3_boundary_f3.otf          |binary
 test/shaping/data/aots/fonts/gsub_chaining3_boundary_f4.otf          |binary
 test/shaping/data/aots/fonts/gsub_chaining3_lookupflag_f1.otf        |binary
 test/shaping/data/aots/fonts/gsub_chaining3_next_glyph_f1.otf        |binary
 test/shaping/data/aots/fonts/gsub_chaining3_simple_f1.otf            |binary
 test/shaping/data/aots/fonts/gsub_chaining3_simple_f2.otf            |binary
 test/shaping/data/aots/fonts/gsub_chaining3_successive_f1.otf        |binary
 test/shaping/data/aots/fonts/gsub_context1_boundary_f1.otf           |binary
 test/shaping/data/aots/fonts/gsub_context1_boundary_f2.otf           |binary
 test/shaping/data/aots/fonts/gsub_context1_expansion_f1.otf          |binary
 test/shaping/data/aots/fonts/gsub_context1_lookupflag_f1.otf         |binary
 test/shaping/data/aots/fonts/gsub_context1_lookupflag_f2.otf         |binary
 test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f1.otf  |binary
 test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f2.otf  |binary
 test/shaping/data/aots/fonts/gsub_context1_next_glyph_f1.otf         |binary
 test/shaping/data/aots/fonts/gsub_context1_simple_f1.otf             |binary
 test/shaping/data/aots/fonts/gsub_context1_simple_f2.otf             |binary
 test/shaping/data/aots/fonts/gsub_context1_successive_f1.otf         |binary
 test/shaping/data/aots/fonts/gsub_context2_boundary_f1.otf           |binary
 test/shaping/data/aots/fonts/gsub_context2_boundary_f2.otf           |binary
 test/shaping/data/aots/fonts/gsub_context2_classes_f1.otf            |binary
 test/shaping/data/aots/fonts/gsub_context2_classes_f2.otf            |binary
 test/shaping/data/aots/fonts/gsub_context2_expansion_f1.otf          |binary
 test/shaping/data/aots/fonts/gsub_context2_lookupflag_f1.otf         |binary
 test/shaping/data/aots/fonts/gsub_context2_lookupflag_f2.otf         |binary
 test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f1.otf  |binary
 test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f2.otf  |binary
 test/shaping/data/aots/fonts/gsub_context2_next_glyph_f1.otf         |binary
 test/shaping/data/aots/fonts/gsub_context2_simple_f1.otf             |binary
 test/shaping/data/aots/fonts/gsub_context2_simple_f2.otf             |binary
 test/shaping/data/aots/fonts/gsub_context2_successive_f1.otf         |binary
 test/shaping/data/aots/fonts/gsub_context3_boundary_f1.otf           |binary
 test/shaping/data/aots/fonts/gsub_context3_boundary_f2.otf           |binary
 test/shaping/data/aots/fonts/gsub_context3_lookupflag_f1.otf         |binary
 test/shaping/data/aots/fonts/gsub_context3_lookupflag_f2.otf         |binary
 test/shaping/data/aots/fonts/gsub_context3_next_glyph_f1.otf         |binary
 test/shaping/data/aots/fonts/gsub_context3_simple_f1.otf             |binary
 test/shaping/data/aots/fonts/gsub_context3_successive_f1.otf         |binary
 test/shaping/data/aots/fonts/lookupflag_ignore_attach_f1.otf         |binary
 test/shaping/data/aots/fonts/lookupflag_ignore_base_f1.otf           |binary
 test/shaping/data/aots/fonts/lookupflag_ignore_combination_f1.otf    |binary
 test/shaping/data/aots/fonts/lookupflag_ignore_ligatures_f1.otf      |binary
 test/shaping/data/aots/fonts/lookupflag_ignore_marks_f1.otf          |binary
 test/shaping/data/aots/hb-aots-tester.cpp                            |  344 ++++++++++
 test/shaping/data/aots/tests/classdef1.tests                         |    1 
 test/shaping/data/aots/tests/classdef1_empty.tests                   |    1 
 test/shaping/data/aots/tests/classdef1_multiple.tests                |    1 
 test/shaping/data/aots/tests/classdef1_single.tests                  |    1 
 test/shaping/data/aots/tests/classdef2.tests                         |    1 
 test/shaping/data/aots/tests/classdef2_empty.tests                   |    1 
 test/shaping/data/aots/tests/classdef2_multiple.tests                |    1 
 test/shaping/data/aots/tests/classdef2_single.tests                  |    1 
 test/shaping/data/aots/tests/gpos1_1_lookupflag.tests                |    1 
 test/shaping/data/aots/tests/gpos1_1_simple.tests                    |    4 
 test/shaping/data/aots/tests/gpos1_2.tests                           |    1 
 test/shaping/data/aots/tests/gpos1_2_lookupflag.tests                |    1 
 test/shaping/data/aots/tests/gpos2_1.tests                           |    2 
 test/shaping/data/aots/tests/gpos2_1_lookupflag.tests                |    2 
 test/shaping/data/aots/tests/gpos2_1_next_glyph.tests                |    2 
 test/shaping/data/aots/tests/gpos2_1_simple.tests                    |    2 
 test/shaping/data/aots/tests/gpos2_2.tests                           |    5 
 test/shaping/data/aots/tests/gpos3.tests                             |   11 
 test/shaping/data/aots/tests/gpos3_lookupflag.tests                  |    2 
 test/shaping/data/aots/tests/gpos4_lookupflag.tests                  |    2 
 test/shaping/data/aots/tests/gpos4_multiple_anchors.tests            |    1 
 test/shaping/data/aots/tests/gpos4_simple.tests                      |    5 
 test/shaping/data/aots/tests/gpos5.tests                             |    2 
 test/shaping/data/aots/tests/gpos6.tests                             |    3 
 test/shaping/data/aots/tests/gpos7_1.tests                           |    2 
 test/shaping/data/aots/tests/gpos9.tests                             |    2 
 test/shaping/data/aots/tests/gpos_chaining1_boundary.tests           |    4 
 test/shaping/data/aots/tests/gpos_chaining1_lookupflag.tests         |    1 
 test/shaping/data/aots/tests/gpos_chaining1_multiple_subrules.tests  |    2 
 test/shaping/data/aots/tests/gpos_chaining1_next_glyph.tests         |    1 
 test/shaping/data/aots/tests/gpos_chaining1_simple.tests             |   11 
 test/shaping/data/aots/tests/gpos_chaining1_successive.tests         |    1 
 test/shaping/data/aots/tests/gpos_chaining2_boundary.tests           |    4 
 test/shaping/data/aots/tests/gpos_chaining2_lookupflag.tests         |    1 
 test/shaping/data/aots/tests/gpos_chaining2_multiple_subrules.tests  |    2 
 test/shaping/data/aots/tests/gpos_chaining2_next_glyph.tests         |    1 
 test/shaping/data/aots/tests/gpos_chaining2_simple.tests             |   11 
 test/shaping/data/aots/tests/gpos_chaining2_successive.tests         |    1 
 test/shaping/data/aots/tests/gpos_chaining3_boundary.tests           |    4 
 test/shaping/data/aots/tests/gpos_chaining3_lookupflag.tests         |    1 
 test/shaping/data/aots/tests/gpos_chaining3_next_glyph.tests         |    1 
 test/shaping/data/aots/tests/gpos_chaining3_simple.tests             |   11 
 test/shaping/data/aots/tests/gpos_chaining3_successive.tests         |    1 
 test/shaping/data/aots/tests/gpos_context1_boundary.tests            |    2 
 test/shaping/data/aots/tests/gpos_context1_expansion.tests           |    1 
 test/shaping/data/aots/tests/gpos_context1_lookupflag.tests          |    2 
 test/shaping/data/aots/tests/gpos_context1_multiple_subrules.tests   |    2 
 test/shaping/data/aots/tests/gpos_context1_next_glyph.tests          |    1 
 test/shaping/data/aots/tests/gpos_context1_simple.tests              |    3 
 test/shaping/data/aots/tests/gpos_context1_successive.tests          |    1 
 test/shaping/data/aots/tests/gpos_context2_boundary.tests            |    2 
 test/shaping/data/aots/tests/gpos_context2_classes.tests             |    2 
 test/shaping/data/aots/tests/gpos_context2_expansion.tests           |    1 
 test/shaping/data/aots/tests/gpos_context2_lookupflag.tests          |    2 
 test/shaping/data/aots/tests/gpos_context2_multiple_subrules.tests   |    2 
 test/shaping/data/aots/tests/gpos_context2_next_glyph.tests          |    1 
 test/shaping/data/aots/tests/gpos_context2_simple.tests              |    3 
 test/shaping/data/aots/tests/gpos_context2_successive.tests          |    1 
 test/shaping/data/aots/tests/gpos_context3_boundary.tests            |    2 
 test/shaping/data/aots/tests/gpos_context3_lookupflag.tests          |    2 
 test/shaping/data/aots/tests/gpos_context3_next_glyph.tests          |    1 
 test/shaping/data/aots/tests/gpos_context3_simple.tests              |    2 
 test/shaping/data/aots/tests/gpos_context3_successive.tests          |    1 
 test/shaping/data/aots/tests/gsub1_1_lookupflag.tests                |    1 
 test/shaping/data/aots/tests/gsub1_1_modulo.tests                    |    1 
 test/shaping/data/aots/tests/gsub1_1_simple.tests                    |    1 
 test/shaping/data/aots/tests/gsub1_2_lookupflag.tests                |    1 
 test/shaping/data/aots/tests/gsub1_2_simple.tests                    |    1 
 test/shaping/data/aots/tests/gsub2_1_lookupflag.tests                |    1 
 test/shaping/data/aots/tests/gsub2_1_multiple_sequences.tests        |    1 
 test/shaping/data/aots/tests/gsub2_1_simple.tests                    |    2 
 test/shaping/data/aots/tests/gsub3_1_lookupflag.tests                |    1 
 test/shaping/data/aots/tests/gsub3_1_multiple.tests                  |    1 
 test/shaping/data/aots/tests/gsub3_1_simple.tests                    |    1 
 test/shaping/data/aots/tests/gsub4_1_lookupflag.tests                |    1 
 test/shaping/data/aots/tests/gsub4_1_multiple_ligatures.tests        |    2 
 test/shaping/data/aots/tests/gsub4_1_multiple_ligsets.tests          |    1 
 test/shaping/data/aots/tests/gsub4_1_simple.tests                    |    1 
 test/shaping/data/aots/tests/gsub7.tests                             |    2 
 test/shaping/data/aots/tests/gsub_chaining1_boundary.tests           |    4 
 test/shaping/data/aots/tests/gsub_chaining1_lookupflag.tests         |    1 
 test/shaping/data/aots/tests/gsub_chaining1_multiple_subrules.tests  |    2 
 test/shaping/data/aots/tests/gsub_chaining1_next_glyph.tests         |    1 
 test/shaping/data/aots/tests/gsub_chaining1_simple.tests             |   11 
 test/shaping/data/aots/tests/gsub_chaining1_successive.tests         |    1 
 test/shaping/data/aots/tests/gsub_chaining2_boundary.tests           |    4 
 test/shaping/data/aots/tests/gsub_chaining2_lookupflag.tests         |    1 
 test/shaping/data/aots/tests/gsub_chaining2_multiple_subrules.tests  |    2 
 test/shaping/data/aots/tests/gsub_chaining2_next_glyph.tests         |    1 
 test/shaping/data/aots/tests/gsub_chaining2_simple.tests             |   11 
 test/shaping/data/aots/tests/gsub_chaining2_successive.tests         |    1 
 test/shaping/data/aots/tests/gsub_chaining3_boundary.tests           |    4 
 test/shaping/data/aots/tests/gsub_chaining3_lookupflag.tests         |    1 
 test/shaping/data/aots/tests/gsub_chaining3_next_glyph.tests         |    1 
 test/shaping/data/aots/tests/gsub_chaining3_simple.tests             |   11 
 test/shaping/data/aots/tests/gsub_chaining3_successive.tests         |    1 
 test/shaping/data/aots/tests/gsub_context1_boundary.tests            |    2 
 test/shaping/data/aots/tests/gsub_context1_expansion.tests           |    1 
 test/shaping/data/aots/tests/gsub_context1_lookupflag.tests          |    2 
 test/shaping/data/aots/tests/gsub_context1_multiple_subrules.tests   |    2 
 test/shaping/data/aots/tests/gsub_context1_next_glyph.tests          |    1 
 test/shaping/data/aots/tests/gsub_context1_simple.tests              |    3 
 test/shaping/data/aots/tests/gsub_context1_successive.tests          |    1 
 test/shaping/data/aots/tests/gsub_context2_boundary.tests            |    2 
 test/shaping/data/aots/tests/gsub_context2_classes.tests             |    2 
 test/shaping/data/aots/tests/gsub_context2_expansion.tests           |    1 
 test/shaping/data/aots/tests/gsub_context2_lookupflag.tests          |    2 
 test/shaping/data/aots/tests/gsub_context2_multiple_subrules.tests   |    2 
 test/shaping/data/aots/tests/gsub_context2_next_glyph.tests          |    1 
 test/shaping/data/aots/tests/gsub_context2_simple.tests              |    3 
 test/shaping/data/aots/tests/gsub_context2_successive.tests          |    1 
 test/shaping/data/aots/tests/gsub_context3_boundary.tests            |    2 
 test/shaping/data/aots/tests/gsub_context3_lookupflag.tests          |    2 
 test/shaping/data/aots/tests/gsub_context3_next_glyph.tests          |    1 
 test/shaping/data/aots/tests/gsub_context3_simple.tests              |    2 
 test/shaping/data/aots/tests/gsub_context3_successive.tests          |    1 
 test/shaping/data/aots/tests/lookupflag_ignore_attach.tests          |    5 
 test/shaping/data/aots/tests/lookupflag_ignore_base.tests            |    2 
 test/shaping/data/aots/tests/lookupflag_ignore_combination.tests     |    3 
 test/shaping/data/aots/tests/lookupflag_ignore_ligatures.tests       |    3 
 test/shaping/data/aots/tests/lookupflag_ignore_marks.tests           |    1 
 test/shaping/run-tests.py                                            |    9 
 334 files changed, 818 insertions(+), 11 deletions(-)

New commits:
commit 20edc70d537b01e8a384ee05673335f2f8a18238
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Sat Nov 24 14:52:34 2018 -0500

    [morx/kerx] Fix sanitize regression
    
    Broke in 8dcc1913a1670ede7b124f7b5b775d7ab8791386
    
    If sanitizer is left with another object, it wouldn't work.
    
    Better fix coming soon.

diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh
index 2d548932..fbeb35b0 100644
--- a/src/hb-aat-layout-kerx-table.hh
+++ b/src/hb-aat-layout-kerx-table.hh
@@ -962,11 +962,9 @@ struct KerxTable
     unsigned int count = thiz()->tableCount;
     for (unsigned int i = 0; i < count; i++)
     {
+      c->reset_object ();
       if (unlikely (!st->u.header.sanitize (c)))
-      {
-	c->reset_object ();
 	return_trace (false);
-      }
       /* OpenType kern table has 2-byte subtable lengths.  That's limiting.
        * MS implementation also only supports one subtable, of format 0,
        * anyway.  Certain versions of some fonts, like Calibry, contain
@@ -976,8 +974,6 @@ struct KerxTable
        * the length for the last subtable. */
       if (i < count - 1)
 	c->set_object (*st);
-      else
-	c->reset_object ();
 
       if (unlikely (!st->sanitize (c)))
 	return_trace (false);
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index 5b44a4cf..dc406f59 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -1061,11 +1061,9 @@ struct Chain
     unsigned int count = subtableCount;
     for (unsigned int i = 0; i < count; i++)
     {
+      c->reset_object ();
       if (unlikely (!c->check_struct (subtable)))
-      {
-	c->reset_object ();
 	return_trace (false);
-      }
       c->set_object (*subtable);
       if (!subtable->sanitize (c))
 	return_trace (false);
commit 3cc14e78aeb1c70eb82891ab4513c0e7d0f59928
Author: Ebrahim Byagowi <ebrahim at gnu.org>
Date:   Sat Nov 24 20:49:21 2018 +0330

    [test] Enable more of aots tests (#1408)
    
    The ones commented out in this change should've be passed :/
    a closer look is needed.

diff --git a/test/shaping/data/aots/Makefile.sources b/test/shaping/data/aots/Makefile.sources
index 8340bb6c..93396824 100644
--- a/test/shaping/data/aots/Makefile.sources
+++ b/test/shaping/data/aots/Makefile.sources
@@ -1,21 +1,12 @@
 TESTS = \
+	tests/classdef1_empty.tests \
+	tests/classdef1_multiple.tests \
 	tests/classdef1_single.tests \
 	tests/classdef1.tests \
 	tests/classdef2_empty.tests \
+	tests/classdef2_multiple.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 \
@@ -53,21 +44,24 @@ 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/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/gpos3_lookupflag.tests \
+	tests/gpos3.tests \
+	tests/gpos4_lookupflag.tests \
+	tests/gpos4_multiple_anchors.tests \
+	tests/gpos4_simple.tests \
+	tests/gpos5.tests \
+	tests/gpos6.tests \
+	tests/gpos7_1.tests \
+	tests/gpos9.tests \
 	tests/gsub_chaining1_boundary.tests \
 	tests/gsub_chaining1_lookupflag.tests \
 	tests/gsub_chaining1_multiple_subrules.tests \
@@ -105,6 +99,23 @@ TESTS = \
 	tests/gsub_context3_next_glyph.tests \
 	tests/gsub_context3_simple.tests \
 	tests/gsub_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/gsub3_1_simple.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/lookupflag_ignore_attach.tests \
 	tests/lookupflag_ignore_base.tests \
 	tests/lookupflag_ignore_combination.tests \
 	tests/lookupflag_ignore_ligatures.tests \
@@ -112,15 +123,4 @@ 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/hb-aots-tester.cpp b/test/shaping/data/aots/hb-aots-tester.cpp
index 81e30076..bd46dec3 100644
--- a/test/shaping/data/aots/hb-aots-tester.cpp
+++ b/test/shaping/data/aots/hb-aots-tester.cpp
@@ -153,6 +153,7 @@ bool gsub_test(const char *testName,
     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++)
     {
diff --git a/test/shaping/data/aots/tests/classdef1_empty.tests b/test/shaping/data/aots/tests/classdef1_empty.tests
index 71d87f1c..76aaecc4 100644
--- a/test/shaping/data/aots/tests/classdef1_empty.tests
+++ b/test/shaping/data/aots/tests/classdef1_empty.tests
@@ -1 +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]
+#../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/gsub3_1_simple.tests b/test/shaping/data/aots/tests/gsub3_1_simple.tests
index 5e65ba05..b8a28d15 100644
--- a/test/shaping/data/aots/tests/gsub3_1_simple.tests
+++ b/test/shaping/data/aots/tests/gsub3_1_simple.tests
@@ -1 +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]
+#../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/lookupflag_ignore_attach.tests b/test/shaping/data/aots/tests/lookupflag_ignore_attach.tests
index 6534fc09..55ae5385 100644
--- a/test/shaping/data/aots/tests/lookupflag_ignore_attach.tests
+++ b/test/shaping/data/aots/tests/lookupflag_ignore_attach.tests
@@ -1,5 +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]
+#../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]
commit 24887d1115ee41cfad70577eb243382f6c23ab6e
Author: Ebrahim Byagowi <ebrahim at gnu.org>
Date:   Sat Nov 24 20:07:24 2018 +0330

    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.

diff --git a/configure.ac b/configure.ac
index 95ab48f8..e9db42a7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -508,6 +508,7 @@ test/api/Makefile
 test/fuzzing/Makefile
 test/shaping/Makefile
 test/shaping/data/Makefile
+test/shaping/data/aots/Makefile
 test/shaping/data/in-house/Makefile
 test/shaping/data/text-rendering-tests/Makefile
 test/subset/Makefile
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
Binary files /dev/null and b/test/shaping/data/aots/fonts/classdef1_font3.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/classdef1_font4.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/classdef2_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/classdef2_font2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/classdef2_font3.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/classdef2_font4.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap0_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap10_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap10_font2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap12_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap14_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap2_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap4_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap4_font2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap4_font3.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap4_font4.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap6_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap6_font2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap8_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap_composition_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap_subtableselection_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap_subtableselection_font2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap_subtableselection_font3.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap_subtableselection_font4.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/cmap_subtableselection_font5.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos1_1_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos1_1_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos1_1_simple_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos1_1_simple_f3.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos1_1_simple_f4.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos1_2_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos1_2_font2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos2_1_font6.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos2_1_font7.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos2_1_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos2_1_lookupflag_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos2_1_next_glyph_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos2_1_next_glyph_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos2_1_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos2_2_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos2_2_font2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos2_2_font3.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos2_2_font4.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos2_2_font5.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos3_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos3_font2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos3_font3.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos4_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos4_lookupflag_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos4_multiple_anchors_1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos4_simple_1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos5_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos6_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos7_1_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos9_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos9_font2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f3.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining1_boundary_f4.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining1_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining1_multiple_subrules_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining1_next_glyph_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining1_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining1_simple_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining1_successive_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f3.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining2_boundary_f4.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining2_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining2_multiple_subrules_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining2_next_glyph_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining2_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining2_simple_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining2_successive_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f3.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining3_boundary_f4.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining3_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining3_next_glyph_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining3_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining3_simple_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_chaining3_successive_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context1_boundary_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context1_boundary_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context1_expansion_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context1_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context1_lookupflag_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context1_multiple_subrules_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context1_next_glyph_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context1_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context1_simple_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context1_successive_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context2_boundary_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context2_boundary_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context2_classes_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context2_classes_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context2_expansion_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context2_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context2_lookupflag_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context2_multiple_subrules_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context2_next_glyph_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context2_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context2_simple_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context2_successive_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context3_boundary_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context3_boundary_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context3_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context3_lookupflag_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context3_next_glyph_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context3_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gpos_context3_successive_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub1_1_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub1_1_modulo_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub1_1_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub1_2_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub1_2_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub2_1_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub2_1_multiple_sequences_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub2_1_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub3_1_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub3_1_multiple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub3_1_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub4_1_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligatures_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub4_1_multiple_ligsets_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub4_1_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub7_font1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub7_font2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f3.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining1_boundary_f4.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining1_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining1_multiple_subrules_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining1_next_glyph_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining1_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining1_simple_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining1_successive_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f3.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining2_boundary_f4.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining2_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining2_multiple_subrules_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining2_next_glyph_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining2_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining2_simple_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining2_successive_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f3.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining3_boundary_f4.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining3_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining3_next_glyph_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining3_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining3_simple_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_chaining3_successive_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context1_boundary_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context1_boundary_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context1_expansion_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context1_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context1_lookupflag_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context1_multiple_subrules_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context1_next_glyph_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context1_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context1_simple_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context1_successive_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context2_boundary_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context2_boundary_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context2_classes_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context2_classes_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context2_expansion_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context2_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context2_lookupflag_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context2_multiple_subrules_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context2_next_glyph_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context2_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context2_simple_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context2_successive_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context3_boundary_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context3_boundary_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context3_lookupflag_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context3_lookupflag_f2.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context3_next_glyph_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context3_simple_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/gsub_context3_successive_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/lookupflag_ignore_attach_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/lookupflag_ignore_base_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/lookupflag_ignore_combination_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/lookupflag_ignore_ligatures_f1.otf 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
Binary files /dev/null and b/test/shaping/data/aots/fonts/lookupflag_ignore_marks_f1.otf 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 at 1500,0|19 at 3000,0|20 at 4200,0|21 at 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 at 1300,0|19 at 3000,0|20 at 4300,0|21 at 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 at 1500,-200|19 at 3000,0|20 at 4500,-200|21 at 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 at 1500,0|19 at 2800,0|20 at 4300,0|21 at 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 at 1500,0|19 at 3000,-200|20 at 4500,-200|21 at 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 at 1300,0|19 at 3000,0|20 at 4200,0|21 at 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 at 1500,0|19 at 3000,0|20 at 4200,0|21 at 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 at 1300,0|19 at 3000,-100|17 at 4500,0|18 at 5700,0|20 at 7500,-400|17 at 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 at 1300,0|19 at 3000,-100|17 at 4500,0|18 at 5700,0|20 at 7500,-400|17 at 9000,0|21 at 10000,0|22 at 12000,-600|17 at 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 at 1300,0|20 at 3000,-100|17 at 4500,0|19 at 5800,0|18 at 7500,0|20 at 9000,-100|17 at 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 at 1500,0|20 at 2800,-100|17 at 4300,0|19 at 5800,0|18 at 7100,0|20 at 8600,-100|17 at 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 at -100,0|18 at 1500,-100|18 at 2900,0|18 at 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 at -100,0|18 at 1400,0|18 at 2900,0|18 at 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 at 1300,0|19 at 3000,-100|17 at 4500,0|18 at 6000,0|20 at 7500,0]
+../fonts/gpos2_1_simple_f1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012:[17|18 at 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 at 1300,0|19 at 3000,-100|17 at 4500,0|18 at 6000,0|20 at 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 at 1300,0|20 at 3000,-100|17 at 4500,0|19 at 5800,0|18 at 7500,0|20 at 9000,-100|17 at 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 at 1500,0|20 at 2800,-100|17 at 4300,0|19 at 5800,0|18 at 7100,0|20 at 8600,-100|17 at 10100,0]
+../fonts/gpos2_2_font4.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0012,U+0012,U+0012,U+0012:[18 at -100,0|18 at 1500,-100|18 at 2900,0|18 at 4500,-100]
+../fonts/gpos2_2_font5.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0012,U+0012,U+0012,U+0012:[18 at -100,0|18 at 1400,0|18 at 2900,0|18 at 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 at 1500,0|19 at 1599,99|17 at 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 at 1500,0|17 at 3000,0|19 at 4500,0|17 at 6000,0]
+#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0012,U+0011:[17|18 at 1500,0|18 at 1600,100|17 at 4500,0]
+#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0013,U+0011:[17|18 at 1500,0|19 at 1599,99|17 at 4500,0]
+#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0014,U+0012,U+0011:[17|20 at 1500,0|18 at 1602,102|17 at 4500,0]
+#../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0014,U+0013,U+0011:[17|20 at 1500,0|19 at 1601,101|17 at 4500,0]
+../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012,U+0014,U+0011:[17|18 at 1500,0|20 at 3000,0|17 at 4500,0]
+../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0012,U+0011:[17|19 at 1500,0|18 at 3000,0|17 at 4500,0]
+../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0013,U+0014,U+0011:[17|19 at 1500,0|20 at 3000,0|17 at 4500,0]
+../fonts/gpos3_font3.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0012:[17|18 at 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 at 1500,0|21 at 3000,0|21 at 4500,0|21 at 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 at 1500,0|21 at 3000,0|19 at 1599,99|17 at 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 at 1500,0|21 at 3000,0|21 at 4500,0|21 at 6000,0|19 at 1599,99|17 at 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 at 1500,0|17 at 3000,0|19 at 4500,0|17 at 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 at 1500,0|19 at 3000,0|17 at 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 at -100,-80|20 at -91,-71|21 at -102,-82|22 at -93,-73|18 at 7500,0|19 at 7420,-60|20 at 7429,-51|21 at 7418,-62|22 at 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 at 1500,0|19 at 1400,-80|17 at 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 at 1500,0|19 at 3000,0|17 at 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 at 1500,0|19 at 3000,0|17 at 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 at 1500,0|19 at 1400,-80|19 at 1400,-80|17 at 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 at 1500,0|20 at 3000,0|19 at 1400,-80|17 at 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 at 1500,0|19 at 1400,-80|17 at 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 at 1500,0|19 at 1401,-79|17 at 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 at 1500,0|19 at 1400,-80|17 at 4500,0]
+#../fonts/gpos6_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0011,U+0011,U+0013,U+0011:[17|17 at 1500,0|19 at 3000,0|17 at 4500,0]
+#../fonts/gpos6_font1.otf:--features="test" --no-clusters --no-glyph-names --ned:U+0014,U+0014,U+0013,U+0011:[20|20 at 1500,0|19 at 3000,0|17 at 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 at 1600,0|19 at 3200,0|20 at 4800,0|21 at 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 at 1500,0|17 at 3000,0|18 at 4500,0|19 at 6000,0|17 at 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 at 1300,0|19 at 3000,0|20 at 4300,0|21 at 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 at 1300,0|19 at 2700,0|20 at 4300,0|21 at 5700,0|17 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4500,0|23 at 6000,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4500,0|23 at 6000,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4520,0|23 at 6000,0|0 at 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 at 1500,0|90 at 3000,0|21 at 4500,0|91 at 6000,0|22 at 7500,0|92 at 9000,0|23 at 10520,0|93 at 12000,0|94 at 13500,0|24 at 15000,0|90 at 16500,0|25 at 18000,0|91 at 19500,0|26 at 21000,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4500,0|23 at 6000,0|24 at 7500,0|0 at 9000,0|20 at 10500,0|21 at 12000,0|22 at 13520,0|23 at 15000,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4520,0|23 at 6000,0|24 at 7500,0|0 at 9000,0|20 at 10500,0|21 at 12000,0|22 at 13520,0|23 at 15000,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4520,0|23 at 6020,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4520,0|23 at 6000,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4520,0|23 at 6000,0|24 at 7500,0|25 at 9000,0|26 at 10500,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|24 at 7500,0|25 at 9000,0|0 at 10500,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|24 at 7500,0|25 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|24 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|24 at 7500,0|25 at 9000,0|26 at 10500,0|0 at 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 at 1500,0|23 at 3000,0|24 at 4500,0|25 at 6000,0|26 at 7500,0|0 at 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 at 1500,0|24 at 3000,0|25 at 4500,0|26 at 6000,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|0 at 6000,0|24 at 7500,0|25 at 9000,0|26 at 10500,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 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 at 1500,0|21 at 3000,0|22 at 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 at 1500,0|20 at 3000,0|21 at 4520,0|22 at 6020,0|23 at 7500,0|24 at 9000,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4500,0|23 at 6000,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4500,0|23 at 6000,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4520,0|23 at 6000,0|0 at 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 at 1500,0|90 at 3000,0|21 at 4500,0|91 at 6000,0|22 at 7500,0|92 at 9000,0|23 at 10520,0|93 at 12000,0|94 at 13500,0|24 at 15000,0|90 at 16500,0|25 at 18000,0|91 at 19500,0|26 at 21000,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4500,0|23 at 6000,0|24 at 7500,0|0 at 9000,0|20 at 10500,0|21 at 12000,0|22 at 13520,0|23 at 15000,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4520,0|23 at 6000,0|24 at 7500,0|0 at 9000,0|20 at 10500,0|21 at 12000,0|22 at 13520,0|23 at 15000,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4520,0|23 at 6020,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4520,0|23 at 6000,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4520,0|23 at 6000,0|24 at 7500,0|25 at 9000,0|26 at 10500,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|24 at 7500,0|25 at 9000,0|0 at 10500,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|24 at 7500,0|25 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|24 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|24 at 7500,0|25 at 9000,0|26 at 10500,0|0 at 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 at 1500,0|23 at 3000,0|24 at 4500,0|25 at 6000,0|26 at 7500,0|0 at 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 at 1500,0|24 at 3000,0|25 at 4500,0|26 at 6000,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|0 at 6000,0|24 at 7500,0|25 at 9000,0|26 at 10500,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 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 at 1500,0|21 at 3000,0|22 at 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 at 1500,0|20 at 3000,0|21 at 4520,0|22 at 6020,0|23 at 7500,0|24 at 9000,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4500,0|23 at 6000,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4500,0|23 at 6000,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4520,0|23 at 6000,0|0 at 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 at 1500,0|90 at 3000,0|21 at 4500,0|91 at 6000,0|22 at 7500,0|92 at 9000,0|23 at 10520,0|93 at 12000,0|94 at 13500,0|24 at 15000,0|90 at 16500,0|25 at 18000,0|91 at 19500,0|26 at 21000,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4500,0|21 at 6020,0|22 at 7500,0|21 at 9000,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4520,0|23 at 6000,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4520,0|23 at 6000,0|24 at 7500,0|25 at 9000,0|26 at 10500,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|24 at 7500,0|25 at 9000,0|0 at 10500,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|24 at 7500,0|25 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|24 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 6000,0|24 at 7500,0|25 at 9000,0|26 at 10500,0|0 at 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 at 1500,0|23 at 3000,0|24 at 4500,0|25 at 6000,0|26 at 7500,0|0 at 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 at 1500,0|24 at 3000,0|25 at 4500,0|26 at 6000,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|0 at 6000,0|24 at 7500,0|25 at 9000,0|26 at 10500,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|23 at 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 at 1500,0|21 at 3000,0|22 at 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 at 1500,0|20 at 3000,0|21 at 4520,0|22 at 6020,0|23 at 7500,0|24 at 9000,0|0 at 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 at 1500,0|20 at 3000,0|20 at 4500,0|20 at 6000,0|20 at 7500,0|0 at 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 at 1520,0|20 at 3020,0|20 at 4520,0|20 at 6020,0|20 at 7520,0|0 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|0 at 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 at 1520,0|90 at 3000,0|21 at 4520,0|91 at 6000,0|92 at 7500,0|22 at 9020,0|0 at 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 at 1500,0|90 at 3000,0|21 at 4520,0|91 at 6000,0|92 at 7500,0|22 at 9000,0|0 at 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 at 1520,0|21 at 3000,0|22 at 4500,0|0 at 6000,0|20 at 7500,0|21 at 9020,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4500,0|0 at 6000,0|20 at 7500,0|21 at 9020,0|0 at 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 at 1520,0|20 at 3000,0|20 at 4520,0|20 at 6000,0|20 at 7500,0|0 at 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 at 1520,0|21 at 3020,0|22 at 4520,0|0 at 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 at 1500,0|0 at 3000,0|20 at 4500,0|21 at 6000,0|0 at 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 at 1500,0|20 at 3020,0|20 at 4500,0|20 at 6000,0|20 at 7500,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4520,0|23 at 6000,0|0 at 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 at 1500,0|20 at 3000,0|20 at 4500,0|20 at 6000,0|20 at 7500,0|0 at 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 at 1520,0|20 at 3020,0|20 at 4520,0|20 at 6020,0|20 at 7520,0|0 at 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 at 1500,0|26 at 3020,0|28 at 4500,0|24 at 6000,0|0 at 7500,0|21 at 9000,0|27 at 10520,0|26 at 12000,0|24 at 13500,0|0 at 15000,0|22 at 16500,0|27 at 18000,0|26 at 19500,0|24 at 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 at 1500,0|27 at 3020,0|26 at 4500,0|24 at 6000,0|0 at 7500,0|24 at 9000,0|24 at 10500,0|29 at 12020,0|22 at 13500,0|0 at 15000,0|22 at 16500,0|27 at 18020,0|26 at 19500,0|24 at 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 at 1500,0|21 at 3000,0|22 at 4500,0|0 at 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 at 1520,0|90 at 3000,0|21 at 4520,0|91 at 6000,0|92 at 7500,0|22 at 9020,0|0 at 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 at 1500,0|90 at 3000,0|21 at 4520,0|91 at 6000,0|92 at 7500,0|22 at 9000,0|0 at 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 at 1520,0|21 at 3000,0|22 at 4500,0|0 at 6000,0|20 at 7500,0|21 at 9020,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4500,0|0 at 6000,0|20 at 7500,0|21 at 9020,0|0 at 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 at 1520,0|20 at 3000,0|20 at 4520,0|20 at 6000,0|20 at 7500,0|0 at 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 at 1520,0|21 at 3020,0|22 at 4520,0|0 at 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 at 1500,0|0 at 3000,0|20 at 4500,0|21 at 6000,0|0 at 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 at 1500,0|20 at 3020,0|20 at 4500,0|20 at 6000,0|20 at 7500,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4520,0|23 at 6000,0|0 at 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 at 1500,0|20 at 3000,0|20 at 4500,0|20 at 6000,0|20 at 7500,0|0 at 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 at 1520,0|20 at 3020,0|20 at 4520,0|20 at 6020,0|20 at 7520,0|0 at 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 at 1520,0|90 at 3000,0|21 at 4520,0|91 at 6000,0|92 at 7500,0|22 at 9020,0|0 at 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 at 1500,0|90 at 3000,0|21 at 4520,0|91 at 6000,0|92 at 7500,0|22 at 9000,0|0 at 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 at 1520,0|20 at 3000,0|20 at 4520,0|20 at 6000,0|20 at 7500,0|0 at 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 at 1520,0|21 at 3020,0|22 at 4520,0|0 at 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 at 1500,0|0 at 3000,0|20 at 4500,0|21 at 6000,0|0 at 7500,0|20 at 9020,0|21 at 10520,0|22 at 12020,0|0 at 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 at 1500,0|21 at 3020,0|22 at 4520,0|23 at 6000,0|0 at 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.")


More information about the HarfBuzz mailing list