github.com/anakojm/hugo-katex@v0.0.0-20231023141351-42d6f5de9c0b/output/layouts/layout_test.go (about)

     1  // Copyright 2017-present The Hugo Authors. All rights reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  // http://www.apache.org/licenses/LICENSE-2.0
     7  //
     8  // Unless required by applicable law or agreed to in writing, software
     9  // distributed under the License is distributed on an "AS IS" BASIS,
    10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package layouts
    15  
    16  import (
    17  	"fmt"
    18  	"reflect"
    19  	"strings"
    20  	"testing"
    21  
    22  	qt "github.com/frankban/quicktest"
    23  	"github.com/kylelemons/godebug/diff"
    24  )
    25  
    26  func TestLayout(t *testing.T) {
    27  	c := qt.New(t)
    28  
    29  	for _, this := range []struct {
    30  		name             string
    31  		layoutDescriptor LayoutDescriptor
    32  		layoutOverride   string
    33  		expect           []string
    34  	}{
    35  		{
    36  			"Home",
    37  			LayoutDescriptor{Kind: "home", OutputFormatName: "amp", Suffix: "html"},
    38  			"",
    39  			[]string{
    40  				"index.amp.html",
    41  				"home.amp.html",
    42  				"list.amp.html",
    43  				"index.html",
    44  				"home.html",
    45  				"list.html",
    46  				"_default/index.amp.html",
    47  				"_default/home.amp.html",
    48  				"_default/list.amp.html",
    49  				"_default/index.html",
    50  				"_default/home.html",
    51  				"_default/list.html",
    52  			},
    53  		},
    54  		{
    55  			"Home baseof",
    56  			LayoutDescriptor{Kind: "home", Baseof: true, OutputFormatName: "amp", Suffix: "html"},
    57  			"",
    58  			[]string{
    59  				"index-baseof.amp.html",
    60  				"home-baseof.amp.html",
    61  				"list-baseof.amp.html",
    62  				"baseof.amp.html",
    63  				"index-baseof.html",
    64  				"home-baseof.html",
    65  				"list-baseof.html",
    66  				"baseof.html",
    67  				"_default/index-baseof.amp.html",
    68  				"_default/home-baseof.amp.html",
    69  				"_default/list-baseof.amp.html",
    70  				"_default/baseof.amp.html",
    71  				"_default/index-baseof.html",
    72  				"_default/home-baseof.html",
    73  				"_default/list-baseof.html",
    74  				"_default/baseof.html",
    75  			},
    76  		},
    77  		{
    78  			"Home, HTML",
    79  			LayoutDescriptor{Kind: "home", OutputFormatName: "html", Suffix: "html"},
    80  			"",
    81  			// We will eventually get to index.html. This looks stuttery, but makes the lookup logic easy to understand.
    82  			[]string{
    83  				"index.html.html",
    84  				"home.html.html",
    85  				"list.html.html",
    86  				"index.html",
    87  				"home.html",
    88  				"list.html",
    89  				"_default/index.html.html",
    90  				"_default/home.html.html",
    91  				"_default/list.html.html",
    92  				"_default/index.html",
    93  				"_default/home.html",
    94  				"_default/list.html",
    95  			},
    96  		},
    97  		{
    98  			"Home, HTML, baseof",
    99  			LayoutDescriptor{Kind: "home", Baseof: true, OutputFormatName: "html", Suffix: "html"},
   100  			"",
   101  			[]string{
   102  				"index-baseof.html.html",
   103  				"home-baseof.html.html",
   104  				"list-baseof.html.html",
   105  				"baseof.html.html",
   106  				"index-baseof.html",
   107  				"home-baseof.html",
   108  				"list-baseof.html",
   109  				"baseof.html",
   110  				"_default/index-baseof.html.html",
   111  				"_default/home-baseof.html.html",
   112  				"_default/list-baseof.html.html",
   113  				"_default/baseof.html.html",
   114  				"_default/index-baseof.html",
   115  				"_default/home-baseof.html",
   116  				"_default/list-baseof.html",
   117  				"_default/baseof.html",
   118  			},
   119  		},
   120  		{
   121  			"Home, french language",
   122  			LayoutDescriptor{Kind: "home", Lang: "fr", OutputFormatName: "amp", Suffix: "html"},
   123  			"",
   124  			[]string{
   125  				"index.fr.amp.html",
   126  				"home.fr.amp.html",
   127  				"list.fr.amp.html",
   128  				"index.amp.html",
   129  				"home.amp.html",
   130  				"list.amp.html",
   131  				"index.fr.html",
   132  				"home.fr.html",
   133  				"list.fr.html",
   134  				"index.html",
   135  				"home.html",
   136  				"list.html",
   137  				"_default/index.fr.amp.html",
   138  				"_default/home.fr.amp.html",
   139  				"_default/list.fr.amp.html",
   140  				"_default/index.amp.html",
   141  				"_default/home.amp.html",
   142  				"_default/list.amp.html",
   143  				"_default/index.fr.html",
   144  				"_default/home.fr.html",
   145  				"_default/list.fr.html",
   146  				"_default/index.html",
   147  				"_default/home.html",
   148  				"_default/list.html",
   149  			},
   150  		},
   151  		{
   152  			"Home, no ext or delim",
   153  			LayoutDescriptor{Kind: "home", OutputFormatName: "nem", Suffix: ""},
   154  			"",
   155  			[]string{
   156  				"index.nem",
   157  				"home.nem",
   158  				"list.nem",
   159  				"_default/index.nem",
   160  				"_default/home.nem",
   161  				"_default/list.nem",
   162  			},
   163  		},
   164  		{
   165  			"Home, no ext",
   166  			LayoutDescriptor{Kind: "home", OutputFormatName: "nex", Suffix: ""},
   167  			"",
   168  			[]string{
   169  				"index.nex",
   170  				"home.nex",
   171  				"list.nex",
   172  				"_default/index.nex",
   173  				"_default/home.nex",
   174  				"_default/list.nex",
   175  			},
   176  		},
   177  		{
   178  			"Page, no ext or delim",
   179  			LayoutDescriptor{Kind: "page", OutputFormatName: "nem", Suffix: ""},
   180  			"",
   181  			[]string{"_default/single.nem"},
   182  		},
   183  		{
   184  			"Section",
   185  			LayoutDescriptor{Kind: "section", Section: "sect1", OutputFormatName: "amp", Suffix: "html"},
   186  			"",
   187  			[]string{
   188  				"sect1/sect1.amp.html",
   189  				"sect1/section.amp.html",
   190  				"sect1/list.amp.html",
   191  				"sect1/sect1.html",
   192  				"sect1/section.html",
   193  				"sect1/list.html",
   194  				"section/sect1.amp.html",
   195  				"section/section.amp.html",
   196  				"section/list.amp.html",
   197  				"section/sect1.html",
   198  				"section/section.html",
   199  				"section/list.html",
   200  				"_default/sect1.amp.html",
   201  				"_default/section.amp.html",
   202  				"_default/list.amp.html",
   203  				"_default/sect1.html",
   204  				"_default/section.html",
   205  				"_default/list.html",
   206  			},
   207  		},
   208  		{
   209  			"Section, baseof",
   210  			LayoutDescriptor{Kind: "section", Section: "sect1", Baseof: true, OutputFormatName: "amp", Suffix: "html"},
   211  			"",
   212  			[]string{
   213  				"sect1/sect1-baseof.amp.html",
   214  				"sect1/section-baseof.amp.html",
   215  				"sect1/list-baseof.amp.html",
   216  				"sect1/baseof.amp.html",
   217  				"sect1/sect1-baseof.html",
   218  				"sect1/section-baseof.html",
   219  				"sect1/list-baseof.html",
   220  				"sect1/baseof.html",
   221  				"section/sect1-baseof.amp.html",
   222  				"section/section-baseof.amp.html",
   223  				"section/list-baseof.amp.html",
   224  				"section/baseof.amp.html",
   225  				"section/sect1-baseof.html",
   226  				"section/section-baseof.html",
   227  				"section/list-baseof.html",
   228  				"section/baseof.html",
   229  				"_default/sect1-baseof.amp.html",
   230  				"_default/section-baseof.amp.html",
   231  				"_default/list-baseof.amp.html",
   232  				"_default/baseof.amp.html",
   233  				"_default/sect1-baseof.html",
   234  				"_default/section-baseof.html",
   235  				"_default/list-baseof.html",
   236  				"_default/baseof.html",
   237  			},
   238  		},
   239  		{
   240  			"Section, baseof, French, AMP",
   241  			LayoutDescriptor{Kind: "section", Section: "sect1", Lang: "fr", Baseof: true, OutputFormatName: "amp", Suffix: "html"},
   242  			"",
   243  			[]string{
   244  				"sect1/sect1-baseof.fr.amp.html",
   245  				"sect1/section-baseof.fr.amp.html",
   246  				"sect1/list-baseof.fr.amp.html",
   247  				"sect1/baseof.fr.amp.html",
   248  				"sect1/sect1-baseof.amp.html",
   249  				"sect1/section-baseof.amp.html",
   250  				"sect1/list-baseof.amp.html",
   251  				"sect1/baseof.amp.html",
   252  				"sect1/sect1-baseof.fr.html",
   253  				"sect1/section-baseof.fr.html",
   254  				"sect1/list-baseof.fr.html",
   255  				"sect1/baseof.fr.html",
   256  				"sect1/sect1-baseof.html",
   257  				"sect1/section-baseof.html",
   258  				"sect1/list-baseof.html",
   259  				"sect1/baseof.html",
   260  				"section/sect1-baseof.fr.amp.html",
   261  				"section/section-baseof.fr.amp.html",
   262  				"section/list-baseof.fr.amp.html",
   263  				"section/baseof.fr.amp.html",
   264  				"section/sect1-baseof.amp.html",
   265  				"section/section-baseof.amp.html",
   266  				"section/list-baseof.amp.html",
   267  				"section/baseof.amp.html",
   268  				"section/sect1-baseof.fr.html",
   269  				"section/section-baseof.fr.html",
   270  				"section/list-baseof.fr.html",
   271  				"section/baseof.fr.html",
   272  				"section/sect1-baseof.html",
   273  				"section/section-baseof.html",
   274  				"section/list-baseof.html",
   275  				"section/baseof.html",
   276  				"_default/sect1-baseof.fr.amp.html",
   277  				"_default/section-baseof.fr.amp.html",
   278  				"_default/list-baseof.fr.amp.html",
   279  				"_default/baseof.fr.amp.html",
   280  				"_default/sect1-baseof.amp.html",
   281  				"_default/section-baseof.amp.html",
   282  				"_default/list-baseof.amp.html",
   283  				"_default/baseof.amp.html",
   284  				"_default/sect1-baseof.fr.html",
   285  				"_default/section-baseof.fr.html",
   286  				"_default/list-baseof.fr.html",
   287  				"_default/baseof.fr.html",
   288  				"_default/sect1-baseof.html",
   289  				"_default/section-baseof.html",
   290  				"_default/list-baseof.html",
   291  				"_default/baseof.html",
   292  			},
   293  		},
   294  		{
   295  			"Section with layout",
   296  			LayoutDescriptor{Kind: "section", Section: "sect1", Layout: "mylayout", OutputFormatName: "amp", Suffix: "html"},
   297  			"",
   298  			[]string{
   299  				"sect1/mylayout.amp.html",
   300  				"sect1/sect1.amp.html",
   301  				"sect1/section.amp.html",
   302  				"sect1/list.amp.html",
   303  				"sect1/mylayout.html",
   304  				"sect1/sect1.html",
   305  				"sect1/section.html",
   306  				"sect1/list.html",
   307  				"section/mylayout.amp.html",
   308  				"section/sect1.amp.html",
   309  				"section/section.amp.html",
   310  				"section/list.amp.html",
   311  				"section/mylayout.html",
   312  				"section/sect1.html",
   313  				"section/section.html",
   314  				"section/list.html",
   315  				"_default/mylayout.amp.html",
   316  				"_default/sect1.amp.html",
   317  				"_default/section.amp.html",
   318  				"_default/list.amp.html",
   319  				"_default/mylayout.html",
   320  				"_default/sect1.html",
   321  				"_default/section.html",
   322  				"_default/list.html",
   323  			},
   324  		},
   325  		{
   326  			"Term, French, AMP",
   327  			LayoutDescriptor{Kind: "term", Section: "tags", Lang: "fr", OutputFormatName: "amp", Suffix: "html"},
   328  			"",
   329  			[]string{
   330  				"term/term.fr.amp.html",
   331  				"term/tags.fr.amp.html",
   332  				"term/taxonomy.fr.amp.html",
   333  				"term/list.fr.amp.html",
   334  				"term/term.amp.html",
   335  				"term/tags.amp.html",
   336  				"term/taxonomy.amp.html",
   337  				"term/list.amp.html",
   338  				"term/term.fr.html",
   339  				"term/tags.fr.html",
   340  				"term/taxonomy.fr.html",
   341  				"term/list.fr.html",
   342  				"term/term.html",
   343  				"term/tags.html",
   344  				"term/taxonomy.html",
   345  				"term/list.html",
   346  				"taxonomy/term.fr.amp.html",
   347  				"taxonomy/tags.fr.amp.html",
   348  				"taxonomy/taxonomy.fr.amp.html",
   349  				"taxonomy/list.fr.amp.html",
   350  				"taxonomy/term.amp.html",
   351  				"taxonomy/tags.amp.html",
   352  				"taxonomy/taxonomy.amp.html",
   353  				"taxonomy/list.amp.html",
   354  				"taxonomy/term.fr.html",
   355  				"taxonomy/tags.fr.html",
   356  				"taxonomy/taxonomy.fr.html",
   357  				"taxonomy/list.fr.html",
   358  				"taxonomy/term.html",
   359  				"taxonomy/tags.html",
   360  				"taxonomy/taxonomy.html",
   361  				"taxonomy/list.html",
   362  				"tags/term.fr.amp.html",
   363  				"tags/tags.fr.amp.html",
   364  				"tags/taxonomy.fr.amp.html",
   365  				"tags/list.fr.amp.html",
   366  				"tags/term.amp.html",
   367  				"tags/tags.amp.html",
   368  				"tags/taxonomy.amp.html",
   369  				"tags/list.amp.html",
   370  				"tags/term.fr.html",
   371  				"tags/tags.fr.html",
   372  				"tags/taxonomy.fr.html",
   373  				"tags/list.fr.html",
   374  				"tags/term.html",
   375  				"tags/tags.html",
   376  				"tags/taxonomy.html",
   377  				"tags/list.html",
   378  				"_default/term.fr.amp.html",
   379  				"_default/tags.fr.amp.html",
   380  				"_default/taxonomy.fr.amp.html",
   381  				"_default/list.fr.amp.html",
   382  				"_default/term.amp.html",
   383  				"_default/tags.amp.html",
   384  				"_default/taxonomy.amp.html",
   385  				"_default/list.amp.html",
   386  				"_default/term.fr.html",
   387  				"_default/tags.fr.html",
   388  				"_default/taxonomy.fr.html",
   389  				"_default/list.fr.html",
   390  				"_default/term.html",
   391  				"_default/tags.html",
   392  				"_default/taxonomy.html",
   393  				"_default/list.html",
   394  			},
   395  		},
   396  		{
   397  			"Term, baseof, French, AMP",
   398  			LayoutDescriptor{Kind: "term", Section: "tags", Lang: "fr", Baseof: true, OutputFormatName: "amp", Suffix: "html"},
   399  			"",
   400  			[]string{
   401  				"term/term-baseof.fr.amp.html",
   402  				"term/tags-baseof.fr.amp.html",
   403  				"term/taxonomy-baseof.fr.amp.html",
   404  				"term/list-baseof.fr.amp.html",
   405  				"term/baseof.fr.amp.html",
   406  				"term/term-baseof.amp.html",
   407  				"term/tags-baseof.amp.html",
   408  				"term/taxonomy-baseof.amp.html",
   409  				"term/list-baseof.amp.html",
   410  				"term/baseof.amp.html",
   411  				"term/term-baseof.fr.html",
   412  				"term/tags-baseof.fr.html",
   413  				"term/taxonomy-baseof.fr.html",
   414  				"term/list-baseof.fr.html",
   415  				"term/baseof.fr.html",
   416  				"term/term-baseof.html",
   417  				"term/tags-baseof.html",
   418  				"term/taxonomy-baseof.html",
   419  				"term/list-baseof.html",
   420  				"term/baseof.html",
   421  				"taxonomy/term-baseof.fr.amp.html",
   422  				"taxonomy/tags-baseof.fr.amp.html",
   423  				"taxonomy/taxonomy-baseof.fr.amp.html",
   424  				"taxonomy/list-baseof.fr.amp.html",
   425  				"taxonomy/baseof.fr.amp.html",
   426  				"taxonomy/term-baseof.amp.html",
   427  				"taxonomy/tags-baseof.amp.html",
   428  				"taxonomy/taxonomy-baseof.amp.html",
   429  				"taxonomy/list-baseof.amp.html",
   430  				"taxonomy/baseof.amp.html",
   431  				"taxonomy/term-baseof.fr.html",
   432  				"taxonomy/tags-baseof.fr.html",
   433  				"taxonomy/taxonomy-baseof.fr.html",
   434  				"taxonomy/list-baseof.fr.html",
   435  				"taxonomy/baseof.fr.html",
   436  				"taxonomy/term-baseof.html",
   437  				"taxonomy/tags-baseof.html",
   438  				"taxonomy/taxonomy-baseof.html",
   439  				"taxonomy/list-baseof.html",
   440  				"taxonomy/baseof.html",
   441  				"tags/term-baseof.fr.amp.html",
   442  				"tags/tags-baseof.fr.amp.html",
   443  				"tags/taxonomy-baseof.fr.amp.html",
   444  				"tags/list-baseof.fr.amp.html",
   445  				"tags/baseof.fr.amp.html",
   446  				"tags/term-baseof.amp.html",
   447  				"tags/tags-baseof.amp.html",
   448  				"tags/taxonomy-baseof.amp.html",
   449  				"tags/list-baseof.amp.html",
   450  				"tags/baseof.amp.html",
   451  				"tags/term-baseof.fr.html",
   452  				"tags/tags-baseof.fr.html",
   453  				"tags/taxonomy-baseof.fr.html",
   454  				"tags/list-baseof.fr.html",
   455  				"tags/baseof.fr.html",
   456  				"tags/term-baseof.html",
   457  				"tags/tags-baseof.html",
   458  				"tags/taxonomy-baseof.html",
   459  				"tags/list-baseof.html",
   460  				"tags/baseof.html",
   461  				"_default/term-baseof.fr.amp.html",
   462  				"_default/tags-baseof.fr.amp.html",
   463  				"_default/taxonomy-baseof.fr.amp.html",
   464  				"_default/list-baseof.fr.amp.html",
   465  				"_default/baseof.fr.amp.html",
   466  				"_default/term-baseof.amp.html",
   467  				"_default/tags-baseof.amp.html",
   468  				"_default/taxonomy-baseof.amp.html",
   469  				"_default/list-baseof.amp.html",
   470  				"_default/baseof.amp.html",
   471  				"_default/term-baseof.fr.html",
   472  				"_default/tags-baseof.fr.html",
   473  				"_default/taxonomy-baseof.fr.html",
   474  				"_default/list-baseof.fr.html",
   475  				"_default/baseof.fr.html",
   476  				"_default/term-baseof.html",
   477  				"_default/tags-baseof.html",
   478  				"_default/taxonomy-baseof.html",
   479  				"_default/list-baseof.html",
   480  				"_default/baseof.html",
   481  			},
   482  		},
   483  		{
   484  			"Term",
   485  			LayoutDescriptor{Kind: "term", Section: "tags", OutputFormatName: "amp", Suffix: "html"},
   486  			"",
   487  			[]string{
   488  				"term/term.amp.html",
   489  				"term/tags.amp.html",
   490  				"term/taxonomy.amp.html",
   491  				"term/list.amp.html",
   492  				"term/term.html",
   493  				"term/tags.html",
   494  				"term/taxonomy.html",
   495  				"term/list.html",
   496  				"taxonomy/term.amp.html",
   497  				"taxonomy/tags.amp.html",
   498  				"taxonomy/taxonomy.amp.html",
   499  				"taxonomy/list.amp.html",
   500  				"taxonomy/term.html",
   501  				"taxonomy/tags.html",
   502  				"taxonomy/taxonomy.html",
   503  				"taxonomy/list.html",
   504  				"tags/term.amp.html",
   505  				"tags/tags.amp.html",
   506  				"tags/taxonomy.amp.html",
   507  				"tags/list.amp.html",
   508  				"tags/term.html",
   509  				"tags/tags.html",
   510  				"tags/taxonomy.html",
   511  				"tags/list.html",
   512  				"_default/term.amp.html",
   513  				"_default/tags.amp.html",
   514  				"_default/taxonomy.amp.html",
   515  				"_default/list.amp.html",
   516  				"_default/term.html",
   517  				"_default/tags.html",
   518  				"_default/taxonomy.html",
   519  				"_default/list.html",
   520  			},
   521  		},
   522  		{
   523  			"Taxonomy",
   524  			LayoutDescriptor{Kind: "taxonomy", Section: "categories", OutputFormatName: "amp", Suffix: "html"},
   525  			"",
   526  			[]string{
   527  				"categories/categories.terms.amp.html",
   528  				"categories/terms.amp.html",
   529  				"categories/taxonomy.amp.html",
   530  				"categories/list.amp.html",
   531  				"categories/categories.terms.html",
   532  				"categories/terms.html",
   533  				"categories/taxonomy.html",
   534  				"categories/list.html",
   535  				"taxonomy/categories.terms.amp.html",
   536  				"taxonomy/terms.amp.html",
   537  				"taxonomy/taxonomy.amp.html",
   538  				"taxonomy/list.amp.html",
   539  				"taxonomy/categories.terms.html",
   540  				"taxonomy/terms.html",
   541  				"taxonomy/taxonomy.html",
   542  				"taxonomy/list.html",
   543  				"_default/categories.terms.amp.html",
   544  				"_default/terms.amp.html",
   545  				"_default/taxonomy.amp.html",
   546  				"_default/list.amp.html",
   547  				"_default/categories.terms.html",
   548  				"_default/terms.html",
   549  				"_default/taxonomy.html",
   550  				"_default/list.html",
   551  			},
   552  		},
   553  		{
   554  			"Page",
   555  			LayoutDescriptor{Kind: "page", OutputFormatName: "amp", Suffix: "html"},
   556  			"",
   557  			[]string{
   558  				"_default/single.amp.html",
   559  				"_default/single.html",
   560  			},
   561  		},
   562  		{
   563  			"Page, baseof",
   564  			LayoutDescriptor{Kind: "page", Baseof: true, OutputFormatName: "amp", Suffix: "html"},
   565  			"",
   566  			[]string{
   567  				"_default/single-baseof.amp.html",
   568  				"_default/baseof.amp.html",
   569  				"_default/single-baseof.html",
   570  				"_default/baseof.html",
   571  			},
   572  		},
   573  		{
   574  			"Page with layout",
   575  			LayoutDescriptor{Kind: "page", Layout: "mylayout", OutputFormatName: "amp", Suffix: "html"},
   576  			"",
   577  			[]string{
   578  				"_default/mylayout.amp.html",
   579  				"_default/single.amp.html",
   580  				"_default/mylayout.html",
   581  				"_default/single.html",
   582  			},
   583  		},
   584  		{
   585  			"Page with layout, baseof",
   586  			LayoutDescriptor{Kind: "page", Layout: "mylayout", Baseof: true, OutputFormatName: "amp", Suffix: "html"},
   587  			"",
   588  			[]string{
   589  				"_default/mylayout-baseof.amp.html",
   590  				"_default/single-baseof.amp.html",
   591  				"_default/baseof.amp.html",
   592  				"_default/mylayout-baseof.html",
   593  				"_default/single-baseof.html",
   594  				"_default/baseof.html",
   595  			},
   596  		},
   597  		{
   598  			"Page with layout and type",
   599  			LayoutDescriptor{Kind: "page", Layout: "mylayout", Type: "myttype", OutputFormatName: "amp", Suffix: "html"},
   600  			"",
   601  			[]string{
   602  				"myttype/mylayout.amp.html",
   603  				"myttype/single.amp.html",
   604  				"myttype/mylayout.html",
   605  				"myttype/single.html",
   606  				"_default/mylayout.amp.html",
   607  				"_default/single.amp.html",
   608  				"_default/mylayout.html",
   609  				"_default/single.html",
   610  			},
   611  		},
   612  		{
   613  			"Page baseof with layout and type",
   614  			LayoutDescriptor{Kind: "page", Layout: "mylayout", Type: "myttype", Baseof: true, OutputFormatName: "amp", Suffix: "html"},
   615  			"",
   616  			[]string{
   617  				"myttype/mylayout-baseof.amp.html",
   618  				"myttype/single-baseof.amp.html",
   619  				"myttype/baseof.amp.html",
   620  				"myttype/mylayout-baseof.html",
   621  				"myttype/single-baseof.html",
   622  				"myttype/baseof.html",
   623  				"_default/mylayout-baseof.amp.html",
   624  				"_default/single-baseof.amp.html",
   625  				"_default/baseof.amp.html",
   626  				"_default/mylayout-baseof.html",
   627  				"_default/single-baseof.html",
   628  				"_default/baseof.html",
   629  			},
   630  		},
   631  		{
   632  			"Page baseof with layout and type in French",
   633  			LayoutDescriptor{Kind: "page", Layout: "mylayout", Type: "myttype", Lang: "fr", Baseof: true, OutputFormatName: "amp", Suffix: "html"},
   634  			"",
   635  			[]string{
   636  				"myttype/mylayout-baseof.fr.amp.html",
   637  				"myttype/single-baseof.fr.amp.html",
   638  				"myttype/baseof.fr.amp.html",
   639  				"myttype/mylayout-baseof.amp.html",
   640  				"myttype/single-baseof.amp.html",
   641  				"myttype/baseof.amp.html",
   642  				"myttype/mylayout-baseof.fr.html",
   643  				"myttype/single-baseof.fr.html",
   644  				"myttype/baseof.fr.html",
   645  				"myttype/mylayout-baseof.html",
   646  				"myttype/single-baseof.html",
   647  				"myttype/baseof.html",
   648  				"_default/mylayout-baseof.fr.amp.html",
   649  				"_default/single-baseof.fr.amp.html",
   650  				"_default/baseof.fr.amp.html",
   651  				"_default/mylayout-baseof.amp.html",
   652  				"_default/single-baseof.amp.html",
   653  				"_default/baseof.amp.html",
   654  				"_default/mylayout-baseof.fr.html",
   655  				"_default/single-baseof.fr.html",
   656  				"_default/baseof.fr.html",
   657  				"_default/mylayout-baseof.html",
   658  				"_default/single-baseof.html",
   659  				"_default/baseof.html",
   660  			},
   661  		},
   662  		{
   663  			"Page with layout and type with subtype",
   664  			LayoutDescriptor{Kind: "page", Layout: "mylayout", Type: "myttype/mysubtype", OutputFormatName: "amp", Suffix: "html"},
   665  			"",
   666  			[]string{
   667  				"myttype/mysubtype/mylayout.amp.html",
   668  				"myttype/mysubtype/single.amp.html",
   669  				"myttype/mysubtype/mylayout.html",
   670  				"myttype/mysubtype/single.html",
   671  				"_default/mylayout.amp.html",
   672  				"_default/single.amp.html",
   673  				"_default/mylayout.html",
   674  				"_default/single.html",
   675  			},
   676  		},
   677  		// RSS
   678  		{
   679  			"RSS Home",
   680  			LayoutDescriptor{Kind: "home", OutputFormatName: "rss", Suffix: "xml"},
   681  			"",
   682  			[]string{
   683  				"index.rss.xml",
   684  				"home.rss.xml",
   685  				"rss.xml",
   686  				"list.rss.xml",
   687  				"index.xml",
   688  				"home.xml",
   689  				"list.xml",
   690  				"_default/index.rss.xml",
   691  				"_default/home.rss.xml",
   692  				"_default/rss.xml",
   693  				"_default/list.rss.xml",
   694  				"_default/index.xml",
   695  				"_default/home.xml",
   696  				"_default/list.xml",
   697  				"_internal/_default/rss.xml",
   698  			},
   699  		},
   700  		{
   701  			"RSS Home, baseof",
   702  			LayoutDescriptor{Kind: "home", Baseof: true, OutputFormatName: "rss", Suffix: "xml"},
   703  			"",
   704  			[]string{
   705  				"index-baseof.rss.xml",
   706  				"home-baseof.rss.xml",
   707  				"list-baseof.rss.xml",
   708  				"baseof.rss.xml",
   709  				"index-baseof.xml",
   710  				"home-baseof.xml",
   711  				"list-baseof.xml",
   712  				"baseof.xml",
   713  				"_default/index-baseof.rss.xml",
   714  				"_default/home-baseof.rss.xml",
   715  				"_default/list-baseof.rss.xml",
   716  				"_default/baseof.rss.xml",
   717  				"_default/index-baseof.xml",
   718  				"_default/home-baseof.xml",
   719  				"_default/list-baseof.xml",
   720  				"_default/baseof.xml",
   721  			},
   722  		},
   723  		{
   724  			"RSS Section",
   725  			LayoutDescriptor{Kind: "section", Section: "sect1", OutputFormatName: "rss", Suffix: "xml"},
   726  			"",
   727  			[]string{
   728  				"sect1/sect1.rss.xml",
   729  				"sect1/section.rss.xml",
   730  				"sect1/rss.xml",
   731  				"sect1/list.rss.xml",
   732  				"sect1/sect1.xml",
   733  				"sect1/section.xml",
   734  				"sect1/list.xml",
   735  				"section/sect1.rss.xml",
   736  				"section/section.rss.xml",
   737  				"section/rss.xml",
   738  				"section/list.rss.xml",
   739  				"section/sect1.xml",
   740  				"section/section.xml",
   741  				"section/list.xml",
   742  				"_default/sect1.rss.xml",
   743  				"_default/section.rss.xml",
   744  				"_default/rss.xml",
   745  				"_default/list.rss.xml",
   746  				"_default/sect1.xml",
   747  				"_default/section.xml",
   748  				"_default/list.xml",
   749  				"_internal/_default/rss.xml",
   750  			},
   751  		},
   752  		{
   753  			"RSS Term",
   754  			LayoutDescriptor{Kind: "term", Section: "tag", OutputFormatName: "rss", Suffix: "xml"},
   755  			"",
   756  			[]string{
   757  				"term/term.rss.xml",
   758  				"term/tag.rss.xml",
   759  				"term/taxonomy.rss.xml",
   760  				"term/rss.xml",
   761  				"term/list.rss.xml",
   762  				"term/term.xml",
   763  				"term/tag.xml",
   764  				"term/taxonomy.xml",
   765  				"term/list.xml",
   766  				"taxonomy/term.rss.xml",
   767  				"taxonomy/tag.rss.xml",
   768  				"taxonomy/taxonomy.rss.xml",
   769  				"taxonomy/rss.xml",
   770  				"taxonomy/list.rss.xml",
   771  				"taxonomy/term.xml",
   772  				"taxonomy/tag.xml",
   773  				"taxonomy/taxonomy.xml",
   774  				"taxonomy/list.xml",
   775  				"tag/term.rss.xml",
   776  				"tag/tag.rss.xml",
   777  				"tag/taxonomy.rss.xml",
   778  				"tag/rss.xml",
   779  				"tag/list.rss.xml",
   780  				"tag/term.xml",
   781  				"tag/tag.xml",
   782  				"tag/taxonomy.xml",
   783  				"tag/list.xml",
   784  				"_default/term.rss.xml",
   785  				"_default/tag.rss.xml",
   786  				"_default/taxonomy.rss.xml",
   787  				"_default/rss.xml",
   788  				"_default/list.rss.xml",
   789  				"_default/term.xml",
   790  				"_default/tag.xml",
   791  				"_default/taxonomy.xml",
   792  				"_default/list.xml",
   793  				"_internal/_default/rss.xml",
   794  			},
   795  		},
   796  		{
   797  			"RSS Taxonomy",
   798  			LayoutDescriptor{Kind: "taxonomy", Section: "tag", OutputFormatName: "rss", Suffix: "xml"},
   799  			"",
   800  			[]string{
   801  				"tag/tag.terms.rss.xml",
   802  				"tag/terms.rss.xml",
   803  				"tag/taxonomy.rss.xml",
   804  				"tag/rss.xml",
   805  				"tag/list.rss.xml",
   806  				"tag/tag.terms.xml",
   807  				"tag/terms.xml",
   808  				"tag/taxonomy.xml",
   809  				"tag/list.xml",
   810  				"taxonomy/tag.terms.rss.xml",
   811  				"taxonomy/terms.rss.xml",
   812  				"taxonomy/taxonomy.rss.xml",
   813  				"taxonomy/rss.xml",
   814  				"taxonomy/list.rss.xml",
   815  				"taxonomy/tag.terms.xml",
   816  				"taxonomy/terms.xml",
   817  				"taxonomy/taxonomy.xml",
   818  				"taxonomy/list.xml",
   819  				"_default/tag.terms.rss.xml",
   820  				"_default/terms.rss.xml",
   821  				"_default/taxonomy.rss.xml",
   822  				"_default/rss.xml",
   823  				"_default/list.rss.xml",
   824  				"_default/tag.terms.xml",
   825  				"_default/terms.xml",
   826  				"_default/taxonomy.xml",
   827  				"_default/list.xml",
   828  				"_internal/_default/rss.xml",
   829  			},
   830  		},
   831  		{
   832  			"Home plain text",
   833  			LayoutDescriptor{Kind: "home", OutputFormatName: "json", Suffix: "json"},
   834  			"",
   835  			[]string{
   836  				"index.json.json",
   837  				"home.json.json",
   838  				"list.json.json",
   839  				"index.json",
   840  				"home.json",
   841  				"list.json",
   842  				"_default/index.json.json",
   843  				"_default/home.json.json",
   844  				"_default/list.json.json",
   845  				"_default/index.json",
   846  				"_default/home.json",
   847  				"_default/list.json",
   848  			},
   849  		},
   850  		{
   851  			"Page plain text",
   852  			LayoutDescriptor{Kind: "page", OutputFormatName: "json", Suffix: "json"},
   853  			"",
   854  			[]string{
   855  				"_default/single.json.json",
   856  				"_default/single.json",
   857  			},
   858  		},
   859  		{
   860  			"Reserved section, shortcodes",
   861  			LayoutDescriptor{Kind: "section", Section: "shortcodes", Type: "shortcodes", OutputFormatName: "amp", Suffix: "html"},
   862  			"",
   863  			[]string{
   864  				"section/shortcodes.amp.html",
   865  				"section/section.amp.html",
   866  				"section/list.amp.html",
   867  				"section/shortcodes.html",
   868  				"section/section.html",
   869  				"section/list.html",
   870  				"_default/shortcodes.amp.html",
   871  				"_default/section.amp.html",
   872  				"_default/list.amp.html",
   873  				"_default/shortcodes.html",
   874  				"_default/section.html",
   875  				"_default/list.html",
   876  			},
   877  		},
   878  		{
   879  			"Reserved section, partials",
   880  			LayoutDescriptor{Kind: "section", Section: "partials", Type: "partials", OutputFormatName: "amp", Suffix: "html"},
   881  			"",
   882  			[]string{
   883  				"section/partials.amp.html",
   884  				"section/section.amp.html",
   885  				"section/list.amp.html",
   886  				"section/partials.html",
   887  				"section/section.html",
   888  				"section/list.html",
   889  				"_default/partials.amp.html",
   890  				"_default/section.amp.html",
   891  				"_default/list.amp.html",
   892  				"_default/partials.html",
   893  				"_default/section.html",
   894  				"_default/list.html",
   895  			},
   896  		},
   897  		// This is currently always HTML only
   898  		{
   899  			"404, HTML",
   900  			LayoutDescriptor{Kind: "404", OutputFormatName: "html", Suffix: "html"},
   901  			"",
   902  			[]string{
   903  				"404.html.html",
   904  				"404.html",
   905  			},
   906  		},
   907  		{
   908  			"404, HTML baseof",
   909  			LayoutDescriptor{Kind: "404", Baseof: true, OutputFormatName: "html", Suffix: "html"},
   910  			"",
   911  			[]string{
   912  				"404-baseof.html.html",
   913  				"baseof.html.html",
   914  				"404-baseof.html",
   915  				"baseof.html",
   916  				"_default/404-baseof.html.html",
   917  				"_default/baseof.html.html",
   918  				"_default/404-baseof.html",
   919  				"_default/baseof.html",
   920  			},
   921  		},
   922  		{
   923  			"Content hook",
   924  			LayoutDescriptor{Kind: "render-link", RenderingHook: true, Layout: "mylayout", Section: "blog", OutputFormatName: "amp", Suffix: "html"},
   925  			"",
   926  			[]string{
   927  				"blog/_markup/render-link.amp.html",
   928  				"blog/_markup/render-link.html",
   929  				"_default/_markup/render-link.amp.html",
   930  				"_default/_markup/render-link.html",
   931  			},
   932  		},
   933  	} {
   934  		c.Run(this.name, func(c *qt.C) {
   935  			l := NewLayoutHandler()
   936  
   937  			layouts, err := l.For(this.layoutDescriptor)
   938  
   939  			c.Assert(err, qt.IsNil)
   940  			c.Assert(layouts, qt.Not(qt.IsNil), qt.Commentf(this.layoutDescriptor.Kind))
   941  
   942  			if !reflect.DeepEqual(layouts, this.expect) {
   943  				r := strings.NewReplacer(
   944  					"[", "\t\"",
   945  					"]", "\",",
   946  					" ", "\",\n\t\"",
   947  				)
   948  				fmtGot := r.Replace(fmt.Sprintf("%v", layouts))
   949  				fmtExp := r.Replace(fmt.Sprintf("%v", this.expect))
   950  
   951  				c.Fatalf("got %d items, expected %d:\nGot:\n\t%v\nExpected:\n\t%v\nDiff:\n%s", len(layouts), len(this.expect), layouts, this.expect, diff.Diff(fmtExp, fmtGot))
   952  
   953  			}
   954  		})
   955  	}
   956  
   957  }
   958  
   959  /*
   960  func BenchmarkLayout(b *testing.B) {
   961  	descriptor := LayoutDescriptor{Kind: "taxonomy", Section: "categories"}
   962  	l := NewLayoutHandler()
   963  
   964  	for i := 0; i < b.N; i++ {
   965  		_, err := l.For(descriptor, HTMLFormat)
   966  		if err != nil {
   967  			panic(err)
   968  		}
   969  	}
   970  }
   971  
   972  func BenchmarkLayoutUncached(b *testing.B) {
   973  	for i := 0; i < b.N; i++ {
   974  		descriptor := LayoutDescriptor{Kind: "taxonomy", Section: "categories"}
   975  		l := NewLayoutHandler()
   976  
   977  		_, err := l.For(descriptor, HTMLFormat)
   978  		if err != nil {
   979  			panic(err)
   980  		}
   981  	}
   982  }
   983  */