2019-01-02 06:33:26 -05:00
// Copyright 2019 The Hugo Authors. All rights reserved.
2015-12-10 17:19:38 -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.
2015-01-07 15:40:35 -05:00
package helpers
import (
2016-02-05 12:40:49 -05:00
"bytes"
2015-01-27 04:15:57 -05:00
"html/template"
2015-02-05 15:44:15 -05:00
"strings"
2015-01-07 15:40:35 -05:00
"testing"
2015-09-03 06:22:20 -04:00
2019-08-16 09:55:03 -04:00
"github.com/spf13/afero"
"github.com/gohugoio/hugo/common/loggers"
:sparkles: Implement Page bundling and image handling
This commit is not the smallest in Hugo's history.
Some hightlights include:
* Page bundles (for complete articles, keeping images and content together etc.).
* Bundled images can be processed in as many versions/sizes as you need with the three methods `Resize`, `Fill` and `Fit`.
* Processed images are cached inside `resources/_gen/images` (default) in your project.
* Symbolic links (both files and dirs) are now allowed anywhere inside /content
* A new table based build summary
* The "Total in nn ms" now reports the total including the handling of the files inside /static. So if it now reports more than you're used to, it is just **more real** and probably faster than before (see below).
A site building benchmark run compared to `v0.31.1` shows that this should be slightly faster and use less memory:
```bash
▶ ./benchSite.sh "TOML,num_langs=.*,num_root_sections=5,num_pages=(500|1000),tags_per_page=5,shortcodes,render"
benchmark old ns/op new ns/op delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 101785785 78067944 -23.30%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 185481057 149159919 -19.58%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 103149918 85679409 -16.94%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 203515478 169208775 -16.86%
benchmark old allocs new allocs delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 532464 391539 -26.47%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1056549 772702 -26.87%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 555974 406630 -26.86%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1086545 789922 -27.30%
benchmark old bytes new bytes delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 53243246 43598155 -18.12%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 105811617 86087116 -18.64%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 54558852 44545097 -18.35%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 106903858 86978413 -18.64%
```
Fixes #3651
Closes #3158
Fixes #1014
Closes #2021
Fixes #1240
Updates #3757
2017-07-24 03:00:23 -04:00
"github.com/spf13/viper"
2019-08-10 15:05:17 -04:00
qt "github.com/frankban/quicktest"
2015-01-07 15:40:35 -05:00
)
2015-03-11 13:34:57 -04:00
const tstHTMLContent = "<!DOCTYPE html><html><head><script src=\"http://two/foobar.js\"></script></head><body><nav><ul><li hugo-nav=\"section_0\"></li><li hugo-nav=\"section_1\"></li></ul></nav><article>content <a href=\"http://two/foobar\">foobar</a>. Follow up</article><p>This is some text.<br>And some more.</p></body></html>"
2015-02-06 04:00:42 -05:00
2019-04-05 13:11:04 -04:00
func TestTrimShortHTML ( t * testing . T ) {
tests := [ ] struct {
input , output [ ] byte
} {
{ [ ] byte ( "" ) , [ ] byte ( "" ) } ,
{ [ ] byte ( "Plain text" ) , [ ] byte ( "Plain text" ) } ,
{ [ ] byte ( " \t\n Whitespace text\n\n" ) , [ ] byte ( "Whitespace text" ) } ,
{ [ ] byte ( "<p>Simple paragraph</p>" ) , [ ] byte ( "Simple paragraph" ) } ,
{ [ ] byte ( "\n \n \t <p> \t Whitespace\nHTML \n\t </p>\n\t" ) , [ ] byte ( "Whitespace\nHTML" ) } ,
{ [ ] byte ( "<p>Multiple</p><p>paragraphs</p>" ) , [ ] byte ( "<p>Multiple</p><p>paragraphs</p>" ) } ,
{ [ ] byte ( "<p>Nested<p>paragraphs</p></p>" ) , [ ] byte ( "<p>Nested<p>paragraphs</p></p>" ) } ,
}
c := newTestContentSpec ( )
for i , test := range tests {
output := c . TrimShortHTML ( test . input )
2019-08-02 10:37:28 -04:00
if ! bytes . Equal ( test . output , output ) {
2019-04-05 13:11:04 -04:00
t . Errorf ( "Test %d failed. Expected %q got %q" , i , test . output , output )
}
}
}
2015-01-07 15:40:35 -05:00
func TestStripHTML ( t * testing . T ) {
type test struct {
input , expected string
}
data := [ ] test {
{ "<h1>strip h1 tag <h1>" , "strip h1 tag " } ,
2016-08-17 07:41:48 -04:00
{ "<p> strip p tag </p>" , " strip p tag " } ,
2015-01-07 15:40:35 -05:00
{ "</br> strip br<br>" , " strip br\n" } ,
2015-02-05 12:31:11 -05:00
{ "</br> strip br2<br />" , " strip br2\n" } ,
{ "This <strong>is</strong> a\nnewline" , "This is a newline" } ,
2016-02-05 12:40:49 -05:00
{ "No Tags" , "No Tags" } ,
2017-04-06 16:24:27 -04:00
{ ` < p > Summary Next Line .
2016-08-17 07:41:48 -04:00
< figure >
2017-04-06 16:24:27 -04:00
2016-08-17 07:41:48 -04:00
< img src = "/not/real" / >
2017-04-06 16:24:27 -04:00
2016-08-17 07:41:48 -04:00
< / figure >
.
More text here . < / p >
< p > Some more text < / p > ` , "Summary Next Line. . More text here.\nSome more text\n" } ,
2015-01-07 15:40:35 -05:00
}
for i , d := range data {
output := StripHTML ( d . input )
if d . expected != output {
t . Errorf ( "Test %d failed. Expected %q got %q" , i , d . expected , output )
}
}
}
2015-01-27 04:15:57 -05:00
2015-02-06 04:00:42 -05:00
func BenchmarkStripHTML ( b * testing . B ) {
b . ResetTimer ( )
for i := 0 ; i < b . N ; i ++ {
2015-03-11 13:34:57 -04:00
StripHTML ( tstHTMLContent )
2015-02-06 04:00:42 -05:00
}
}
2015-01-27 04:15:57 -05:00
func TestStripEmptyNav ( t * testing . T ) {
2019-08-10 15:05:17 -04:00
c := qt . New ( t )
2016-03-14 12:27:15 -04:00
cleaned := stripEmptyNav ( [ ] byte ( "do<nav>\n</nav>\n\nbedobedo" ) )
2019-08-10 15:05:17 -04:00
c . Assert ( cleaned , qt . DeepEquals , [ ] byte ( "dobedobedo" ) )
2015-01-27 04:15:57 -05:00
}
func TestBytesToHTML ( t * testing . T ) {
2019-08-10 15:05:17 -04:00
c := qt . New ( t )
c . Assert ( BytesToHTML ( [ ] byte ( "dobedobedo" ) ) , qt . Equals , template . HTML ( "dobedobedo" ) )
2015-01-27 04:15:57 -05:00
}
2015-02-05 15:44:15 -05:00
:sparkles: Implement Page bundling and image handling
This commit is not the smallest in Hugo's history.
Some hightlights include:
* Page bundles (for complete articles, keeping images and content together etc.).
* Bundled images can be processed in as many versions/sizes as you need with the three methods `Resize`, `Fill` and `Fit`.
* Processed images are cached inside `resources/_gen/images` (default) in your project.
* Symbolic links (both files and dirs) are now allowed anywhere inside /content
* A new table based build summary
* The "Total in nn ms" now reports the total including the handling of the files inside /static. So if it now reports more than you're used to, it is just **more real** and probably faster than before (see below).
A site building benchmark run compared to `v0.31.1` shows that this should be slightly faster and use less memory:
```bash
▶ ./benchSite.sh "TOML,num_langs=.*,num_root_sections=5,num_pages=(500|1000),tags_per_page=5,shortcodes,render"
benchmark old ns/op new ns/op delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 101785785 78067944 -23.30%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 185481057 149159919 -19.58%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 103149918 85679409 -16.94%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 203515478 169208775 -16.86%
benchmark old allocs new allocs delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 532464 391539 -26.47%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1056549 772702 -26.87%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 555974 406630 -26.86%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1086545 789922 -27.30%
benchmark old bytes new bytes delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 53243246 43598155 -18.12%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 105811617 86087116 -18.64%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 54558852 44545097 -18.35%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 106903858 86978413 -18.64%
```
Fixes #3651
Closes #3158
Fixes #1014
Closes #2021
Fixes #1240
Updates #3757
2017-07-24 03:00:23 -04:00
func TestNewContentSpec ( t * testing . T ) {
cfg := viper . New ( )
2019-08-10 15:05:17 -04:00
c := qt . New ( t )
:sparkles: Implement Page bundling and image handling
This commit is not the smallest in Hugo's history.
Some hightlights include:
* Page bundles (for complete articles, keeping images and content together etc.).
* Bundled images can be processed in as many versions/sizes as you need with the three methods `Resize`, `Fill` and `Fit`.
* Processed images are cached inside `resources/_gen/images` (default) in your project.
* Symbolic links (both files and dirs) are now allowed anywhere inside /content
* A new table based build summary
* The "Total in nn ms" now reports the total including the handling of the files inside /static. So if it now reports more than you're used to, it is just **more real** and probably faster than before (see below).
A site building benchmark run compared to `v0.31.1` shows that this should be slightly faster and use less memory:
```bash
▶ ./benchSite.sh "TOML,num_langs=.*,num_root_sections=5,num_pages=(500|1000),tags_per_page=5,shortcodes,render"
benchmark old ns/op new ns/op delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 101785785 78067944 -23.30%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 185481057 149159919 -19.58%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 103149918 85679409 -16.94%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 203515478 169208775 -16.86%
benchmark old allocs new allocs delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 532464 391539 -26.47%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1056549 772702 -26.87%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 555974 406630 -26.86%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1086545 789922 -27.30%
benchmark old bytes new bytes delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 53243246 43598155 -18.12%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 105811617 86087116 -18.64%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 54558852 44545097 -18.35%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 106903858 86978413 -18.64%
```
Fixes #3651
Closes #3158
Fixes #1014
Closes #2021
Fixes #1240
Updates #3757
2017-07-24 03:00:23 -04:00
cfg . Set ( "summaryLength" , 32 )
cfg . Set ( "buildFuture" , true )
cfg . Set ( "buildExpired" , true )
cfg . Set ( "buildDrafts" , true )
2019-08-16 09:55:03 -04:00
spec , err := NewContentSpec ( cfg , loggers . NewErrorLogger ( ) , afero . NewMemMapFs ( ) )
:sparkles: Implement Page bundling and image handling
This commit is not the smallest in Hugo's history.
Some hightlights include:
* Page bundles (for complete articles, keeping images and content together etc.).
* Bundled images can be processed in as many versions/sizes as you need with the three methods `Resize`, `Fill` and `Fit`.
* Processed images are cached inside `resources/_gen/images` (default) in your project.
* Symbolic links (both files and dirs) are now allowed anywhere inside /content
* A new table based build summary
* The "Total in nn ms" now reports the total including the handling of the files inside /static. So if it now reports more than you're used to, it is just **more real** and probably faster than before (see below).
A site building benchmark run compared to `v0.31.1` shows that this should be slightly faster and use less memory:
```bash
▶ ./benchSite.sh "TOML,num_langs=.*,num_root_sections=5,num_pages=(500|1000),tags_per_page=5,shortcodes,render"
benchmark old ns/op new ns/op delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 101785785 78067944 -23.30%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 185481057 149159919 -19.58%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 103149918 85679409 -16.94%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 203515478 169208775 -16.86%
benchmark old allocs new allocs delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 532464 391539 -26.47%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1056549 772702 -26.87%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 555974 406630 -26.86%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1086545 789922 -27.30%
benchmark old bytes new bytes delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 53243246 43598155 -18.12%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 105811617 86087116 -18.64%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 54558852 44545097 -18.35%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 106903858 86978413 -18.64%
```
Fixes #3651
Closes #3158
Fixes #1014
Closes #2021
Fixes #1240
Updates #3757
2017-07-24 03:00:23 -04:00
2019-08-10 15:05:17 -04:00
c . Assert ( err , qt . IsNil )
c . Assert ( spec . summaryLength , qt . Equals , 32 )
c . Assert ( spec . BuildFuture , qt . Equals , true )
c . Assert ( spec . BuildExpired , qt . Equals , true )
c . Assert ( spec . BuildDrafts , qt . Equals , true )
:sparkles: Implement Page bundling and image handling
This commit is not the smallest in Hugo's history.
Some hightlights include:
* Page bundles (for complete articles, keeping images and content together etc.).
* Bundled images can be processed in as many versions/sizes as you need with the three methods `Resize`, `Fill` and `Fit`.
* Processed images are cached inside `resources/_gen/images` (default) in your project.
* Symbolic links (both files and dirs) are now allowed anywhere inside /content
* A new table based build summary
* The "Total in nn ms" now reports the total including the handling of the files inside /static. So if it now reports more than you're used to, it is just **more real** and probably faster than before (see below).
A site building benchmark run compared to `v0.31.1` shows that this should be slightly faster and use less memory:
```bash
▶ ./benchSite.sh "TOML,num_langs=.*,num_root_sections=5,num_pages=(500|1000),tags_per_page=5,shortcodes,render"
benchmark old ns/op new ns/op delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 101785785 78067944 -23.30%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 185481057 149159919 -19.58%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 103149918 85679409 -16.94%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 203515478 169208775 -16.86%
benchmark old allocs new allocs delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 532464 391539 -26.47%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1056549 772702 -26.87%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 555974 406630 -26.86%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1086545 789922 -27.30%
benchmark old bytes new bytes delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 53243246 43598155 -18.12%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 105811617 86087116 -18.64%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 54558852 44545097 -18.35%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 106903858 86978413 -18.64%
```
Fixes #3651
Closes #3158
Fixes #1014
Closes #2021
Fixes #1240
Updates #3757
2017-07-24 03:00:23 -04:00
}
2016-08-16 16:50:15 -04:00
var benchmarkTruncateString = strings . Repeat ( "This is a sentence about nothing." , 20 )
func BenchmarkTestTruncateWordsToWholeSentence ( b * testing . B ) {
2017-09-29 03:04:55 -04:00
c := newTestContentSpec ( )
2016-08-16 16:50:15 -04:00
b . ResetTimer ( )
for i := 0 ; i < b . N ; i ++ {
2017-09-29 03:04:55 -04:00
c . TruncateWordsToWholeSentence ( benchmarkTruncateString )
2016-08-16 16:50:15 -04:00
}
}
func BenchmarkTestTruncateWordsToWholeSentenceOld ( b * testing . B ) {
2017-09-29 03:04:55 -04:00
c := newTestContentSpec ( )
2016-08-16 16:50:15 -04:00
b . ResetTimer ( )
for i := 0 ; i < b . N ; i ++ {
2017-09-29 03:04:55 -04:00
c . truncateWordsToWholeSentenceOld ( benchmarkTruncateString )
2016-08-16 16:50:15 -04:00
}
}
2015-02-05 15:44:15 -05:00
func TestTruncateWordsToWholeSentence ( t * testing . T ) {
2017-09-29 03:04:55 -04:00
c := newTestContentSpec ( )
2015-02-05 15:44:15 -05:00
type test struct {
input , expected string
max int
truncated bool
}
data := [ ] test {
{ "a b c" , "a b c" , 12 , false } ,
{ "a b c" , "a b c" , 3 , false } ,
{ "a" , "a" , 1 , false } ,
{ "This is a sentence." , "This is a sentence." , 5 , false } ,
{ "This is also a sentence!" , "This is also a sentence!" , 1 , false } ,
{ "To be. Or not to be. That's the question." , "To be." , 1 , true } ,
2016-08-16 16:50:15 -04:00
{ " \nThis is not a sentence\nAnd this is another" , "This is not a sentence" , 4 , true } ,
{ "" , "" , 10 , false } ,
2017-09-29 03:04:55 -04:00
{ "This... is a more difficult test?" , "This... is a more difficult test?" , 1 , false } ,
2015-02-05 15:44:15 -05:00
}
for i , d := range data {
2017-09-29 03:04:55 -04:00
c . summaryLength = d . max
output , truncated := c . TruncateWordsToWholeSentence ( d . input )
2015-02-05 15:44:15 -05:00
if d . expected != output {
t . Errorf ( "Test %d failed. Expected %q got %q" , i , d . expected , output )
}
if d . truncated != truncated {
t . Errorf ( "Test %d failed. Expected truncated=%t got %t" , i , d . truncated , truncated )
}
}
}
2015-09-03 06:22:20 -04:00
func TestTruncateWordsByRune ( t * testing . T ) {
2017-09-29 03:04:55 -04:00
c := newTestContentSpec ( )
2015-09-03 06:22:20 -04:00
type test struct {
input , expected string
max int
truncated bool
}
data := [ ] test {
{ "" , "" , 1 , false } ,
{ "a b c" , "a b c" , 12 , false } ,
{ "a b c" , "a b c" , 3 , false } ,
{ "a" , "a" , 1 , false } ,
{ "Hello 中国" , "" , 0 , true } ,
{ "这是中文,全中文。" , "这是中文," , 5 , true } ,
{ "Hello 中国" , "Hello 中" , 2 , true } ,
{ "Hello 中国" , "Hello 中国" , 3 , false } ,
{ "Hello中国 Good 好的" , "Hello中国 Good 好" , 9 , true } ,
{ "This is a sentence." , "This is" , 2 , true } ,
{ "This is also a sentence!" , "This" , 1 , true } ,
{ "To be. Or not to be. That's the question." , "To be. Or not" , 4 , true } ,
{ " \nThis is not a sentence\n " , "This is not" , 3 , true } ,
}
for i , d := range data {
2017-09-29 03:04:55 -04:00
c . summaryLength = d . max
output , truncated := c . TruncateWordsByRune ( strings . Fields ( d . input ) )
2015-09-03 06:22:20 -04:00
if d . expected != output {
t . Errorf ( "Test %d failed. Expected %q got %q" , i , d . expected , output )
}
if d . truncated != truncated {
t . Errorf ( "Test %d failed. Expected truncated=%t got %t" , i , d . truncated , truncated )
}
}
}
2016-02-05 12:40:49 -05:00
func TestExtractTOCNormalContent ( t * testing . T ) {
content := [ ] byte ( "<nav>\n<ul>\nTOC<li><a href=\"#" )
actualTocLessContent , actualToc := ExtractTOC ( content )
expectedTocLess := [ ] byte ( "TOC<li><a href=\"#" )
expectedToc := [ ] byte ( "<nav id=\"TableOfContents\">\n<ul>\n" )
if ! bytes . Equal ( actualTocLessContent , expectedTocLess ) {
t . Errorf ( "Actual tocless (%s) did not equal expected (%s) tocless content" , actualTocLessContent , expectedTocLess )
}
if ! bytes . Equal ( actualToc , expectedToc ) {
t . Errorf ( "Actual toc (%s) did not equal expected (%s) toc content" , actualToc , expectedToc )
}
}
func TestExtractTOCGreaterThanSeventy ( t * testing . T ) {
2016-03-19 16:12:53 -04:00
content := [ ] byte ( "<nav>\n<ul>\nTOC This is a very long content which will definitely be greater than seventy, I promise you that.<li><a href=\"#" )
2016-02-05 12:40:49 -05:00
actualTocLessContent , actualToc := ExtractTOC ( content )
//Because the start of Toc is greater than 70+startpoint of <li> content and empty TOC will be returned
expectedToc := [ ] byte ( "" )
if ! bytes . Equal ( actualTocLessContent , content ) {
t . Errorf ( "Actual tocless (%s) did not equal expected (%s) tocless content" , actualTocLessContent , content )
}
if ! bytes . Equal ( actualToc , expectedToc ) {
t . Errorf ( "Actual toc (%s) did not equal expected (%s) toc content" , actualToc , expectedToc )
}
}
func TestExtractNoTOC ( t * testing . T ) {
content := [ ] byte ( "TOC" )
actualTocLessContent , actualToc := ExtractTOC ( content )
expectedToc := [ ] byte ( "" )
if ! bytes . Equal ( actualTocLessContent , content ) {
t . Errorf ( "Actual tocless (%s) did not equal expected (%s) tocless content" , actualTocLessContent , content )
}
if ! bytes . Equal ( actualToc , expectedToc ) {
t . Errorf ( "Actual toc (%s) did not equal expected (%s) toc content" , actualToc , expectedToc )
}
}
2016-08-17 00:37:19 -04:00
var totalWordsBenchmarkString = strings . Repeat ( "Hugo Rocks " , 200 )
2016-02-05 12:40:49 -05:00
func TestTotalWords ( t * testing . T ) {
2016-08-17 00:37:19 -04:00
for i , this := range [ ] struct {
s string
words int
} {
{ "Two, Words!" , 2 } ,
{ "Word" , 1 } ,
{ "" , 0 } ,
{ "One, Two, Three" , 3 } ,
{ totalWordsBenchmarkString , 400 } ,
} {
actualWordCount := TotalWords ( this . s )
if actualWordCount != this . words {
t . Errorf ( "[%d] Actual word count (%d) for test string (%s) did not match %d" , i , actualWordCount , this . s , this . words )
}
}
}
func BenchmarkTotalWords ( b * testing . B ) {
b . ResetTimer ( )
for i := 0 ; i < b . N ; i ++ {
wordCount := TotalWords ( totalWordsBenchmarkString )
if wordCount != 400 {
b . Fatal ( "Wordcount error" )
}
}
}