2019-01-02 06:33:26 -05:00
// Copyright 2019 The Hugo Authors. All rights reserved.
2018-12-19 14:07:49 -05:00
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file 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.
package pageparser
import (
2022-07-07 10:11:47 -04:00
"bytes"
2018-12-19 14:07:49 -05:00
"strings"
"testing"
2019-09-10 05:26:34 -04:00
qt "github.com/frankban/quicktest"
"github.com/gohugoio/hugo/parser/metadecoders"
2018-12-19 14:07:49 -05:00
)
func BenchmarkParse ( b * testing . B ) {
start := `
Move the emoji parsing to pageparser
This avoids double parsing the page content when `enableEmoji=true`.
This commit also adds some general improvements to the parser, making it in general much faster:
```bash
benchmark old ns/op new ns/op delta
BenchmarkShortcodeLexer-4 90258 101730 +12.71%
BenchmarkParse-4 148940 15037 -89.90%
benchmark old allocs new allocs delta
BenchmarkShortcodeLexer-4 456 700 +53.51%
BenchmarkParse-4 28 33 +17.86%
benchmark old bytes new bytes delta
BenchmarkShortcodeLexer-4 69875 81014 +15.94%
BenchmarkParse-4 8128 8304 +2.17%
```
Running some site benchmarks with Emoji support turned on:
```bash
benchmark old ns/op new ns/op delta
BenchmarkSiteBuilding/TOML,num_langs=3,num_pages=5000,tags_per_page=5,shortcodes,render-4 924556797 818115620 -11.51%
benchmark old allocs new allocs delta
BenchmarkSiteBuilding/TOML,num_langs=3,num_pages=5000,tags_per_page=5,shortcodes,render-4 4112613 4133787 +0.51%
benchmark old bytes new bytes delta
BenchmarkSiteBuilding/TOML,num_langs=3,num_pages=5000,tags_per_page=5,shortcodes,render-4 426982864 424363832 -0.61%
```
Fixes #5534
2018-12-17 15:03:23 -05:00
-- -
title : "Front Matters"
description : "It really does"
-- -
This is some summary . This is some summary . This is some summary . This is some summary .
< ! -- more -- >
`
2023-10-24 06:04:13 -04:00
input := [ ] byte ( start + strings . Repeat ( strings . Repeat ( "this is text" , 30 ) + "{{< myshortcode >}}This is some inner content.{{< /myshortcode >}}" , 10 ) )
cfg := Config { }
Move the emoji parsing to pageparser
This avoids double parsing the page content when `enableEmoji=true`.
This commit also adds some general improvements to the parser, making it in general much faster:
```bash
benchmark old ns/op new ns/op delta
BenchmarkShortcodeLexer-4 90258 101730 +12.71%
BenchmarkParse-4 148940 15037 -89.90%
benchmark old allocs new allocs delta
BenchmarkShortcodeLexer-4 456 700 +53.51%
BenchmarkParse-4 28 33 +17.86%
benchmark old bytes new bytes delta
BenchmarkShortcodeLexer-4 69875 81014 +15.94%
BenchmarkParse-4 8128 8304 +2.17%
```
Running some site benchmarks with Emoji support turned on:
```bash
benchmark old ns/op new ns/op delta
BenchmarkSiteBuilding/TOML,num_langs=3,num_pages=5000,tags_per_page=5,shortcodes,render-4 924556797 818115620 -11.51%
benchmark old allocs new allocs delta
BenchmarkSiteBuilding/TOML,num_langs=3,num_pages=5000,tags_per_page=5,shortcodes,render-4 4112613 4133787 +0.51%
benchmark old bytes new bytes delta
BenchmarkSiteBuilding/TOML,num_langs=3,num_pages=5000,tags_per_page=5,shortcodes,render-4 426982864 424363832 -0.61%
```
Fixes #5534
2018-12-17 15:03:23 -05:00
b . ResetTimer ( )
for i := 0 ; i < b . N ; i ++ {
2019-01-02 06:33:26 -05:00
if _ , err := parseBytes ( input , cfg , lexIntroSection ) ; err != nil {
2018-12-19 14:07:49 -05:00
b . Fatal ( err )
}
}
}
2019-09-10 05:26:34 -04:00
func TestFormatFromFrontMatterType ( t * testing . T ) {
c := qt . New ( t )
for _ , test := range [ ] struct {
typ ItemType
expect metadecoders . Format
} {
{ TypeFrontMatterJSON , metadecoders . JSON } ,
{ TypeFrontMatterTOML , metadecoders . TOML } ,
{ TypeFrontMatterYAML , metadecoders . YAML } ,
{ TypeFrontMatterORG , metadecoders . ORG } ,
{ TypeIgnore , "" } ,
} {
c . Assert ( FormatFromFrontMatterType ( test . typ ) , qt . Equals , test . expect )
}
}
2022-07-07 10:11:47 -04:00
func TestIsProbablyItemsSource ( t * testing . T ) {
c := qt . New ( t )
input := ` {{ < foo > }} `
items := collectStringMain ( input )
c . Assert ( IsProbablySourceOfItems ( [ ] byte ( input ) , items ) , qt . IsTrue )
c . Assert ( IsProbablySourceOfItems ( bytes . Repeat ( [ ] byte ( " " ) , len ( input ) ) , items ) , qt . IsFalse )
c . Assert ( IsProbablySourceOfItems ( [ ] byte ( ` {{ < foo > }} ` ) , items ) , qt . IsFalse )
c . Assert ( IsProbablySourceOfItems ( [ ] byte ( ` ` ) , items ) , qt . IsFalse )
}
2023-01-26 04:30:25 -05:00
func TestHasShortcode ( t * testing . T ) {
c := qt . New ( t )
c . Assert ( HasShortcode ( "{{< foo >}}" ) , qt . IsTrue )
c . Assert ( HasShortcode ( "aSDasd SDasd aSD\n\nasdfadf{{% foo %}}\nasdf" ) , qt . IsTrue )
c . Assert ( HasShortcode ( "{{</* foo */>}}" ) , qt . IsFalse )
c . Assert ( HasShortcode ( "{{%/* foo */%}}" ) , qt . IsFalse )
}
func BenchmarkHasShortcode ( b * testing . B ) {
withShortcode := strings . Repeat ( "this is text" , 30 ) + "{{< myshortcode >}}This is some inner content.{{< /myshortcode >}}" + strings . Repeat ( "this is text" , 30 )
withoutShortcode := strings . Repeat ( "this is text" , 30 ) + "This is some inner content." + strings . Repeat ( "this is text" , 30 )
b . Run ( "Match" , func ( b * testing . B ) {
for i := 0 ; i < b . N ; i ++ {
HasShortcode ( withShortcode )
}
} )
b . Run ( "NoMatch" , func ( b * testing . B ) {
for i := 0 ; i < b . N ; i ++ {
HasShortcode ( withoutShortcode )
}
} )
}