summaryrefslogtreecommitdiffstats
path: root/helpers/general_test.go
diff options
context:
space:
mode:
authorbep <bjorn.erik.pedersen@gmail.com>2015-03-29 20:12:13 +0100
committerbep <bjorn.erik.pedersen@gmail.com>2015-03-29 21:12:13 +0200
commitbe6696c34b1ac262eccb90ab8785128cc4065444 (patch)
tree928628e2eb6f72f38313193802aeac1359d0c19f /helpers/general_test.go
parente8ca8602c003862fe3da87306c2b2c27918b29cc (diff)
Handle views in combo with Ace base templates
As views looks like a regular template, but doesn't need a base template, we have to look inside it. Altough really not needed by this commit, reading the full file content into memory just to do a substring search is a waste. So this commit implements a `ReaderContains` func that in most cases should be much faster than doing an `ioutil.ReadAll` and `bytes.Contains`: ``` benchmark old ns/op new ns/op delta BenchmarkReaderContains 78452 20260 -74.18% benchmark old allocs new allocs delta BenchmarkReaderContains 46 20 -56.52% benchmark old bytes new bytes delta BenchmarkReaderContains 46496 1258 -97.29% ``` Fixes #999
Diffstat (limited to 'helpers/general_test.go')
-rw-r--r--helpers/general_test.go97
1 files changed, 97 insertions, 0 deletions
diff --git a/helpers/general_test.go b/helpers/general_test.go
index b5706a445..496439db1 100644
--- a/helpers/general_test.go
+++ b/helpers/general_test.go
@@ -1,7 +1,9 @@
package helpers
import (
+ "bytes"
"github.com/stretchr/testify/assert"
+ "io/ioutil"
"reflect"
"strings"
"testing"
@@ -44,6 +46,101 @@ func TestStringToReader(t *testing.T) {
assert.Equal(t, asString, ReaderToString(asReader))
}
+var containsTestText = (`На берегу пустынных волн
+Стоял он, дум великих полн,
+И вдаль глядел. Пред ним широко
+Река неслася; бедный чёлн
+По ней стремился одиноко.
+По мшистым, топким берегам
+Чернели избы здесь и там,
+Приют убогого чухонца;
+И лес, неведомый лучам
+В тумане спрятанного солнца,
+Кругом шумел.
+
+Τη γλώσσα μου έδωσαν ελληνική
+το σπίτι φτωχικό στις αμμουδιές του Ομήρου.
+Μονάχη έγνοια η γλώσσα μου στις αμμουδιές του Ομήρου.
+
+από το Άξιον Εστί
+του Οδυσσέα Ελύτη
+
+Sîne klâwen durh die wolken sint geslagen,
+er stîget ûf mit grôzer kraft,
+ich sih in grâwen tägelîch als er wil tagen,
+den tac, der im geselleschaft
+erwenden wil, dem werden man,
+den ich mit sorgen în verliez.
+ich bringe in hinnen, ob ich kan.
+sîn vil manegiu tugent michz leisten hiez.
+`)
+
+var containsBenchTestData = []struct {
+ v1 string
+ v2 []byte
+ expect bool
+}{
+ {"abc", []byte("a"), true},
+ {"abc", []byte("b"), true},
+ {"abcdefg", []byte("efg"), true},
+ {"abc", []byte("d"), false},
+ {containsTestText, []byte("стремился"), true},
+ {containsTestText, []byte(containsTestText[10:80]), true},
+ {containsTestText, []byte(containsTestText[100:110]), true},
+ {containsTestText, []byte(containsTestText[len(containsTestText)-100 : len(containsTestText)-10]), true},
+ {containsTestText, []byte(containsTestText[len(containsTestText)-20:]), true},
+ {containsTestText, []byte("notfound"), false},
+}
+
+// some corner cases
+var containsAdditionalTestData = []struct {
+ v1 string
+ v2 []byte
+ expect bool
+}{
+ {"", []byte("a"), false},
+ {"a", []byte(""), false},
+ {"", []byte(""), false},
+}
+
+func TestReaderContains(t *testing.T) {
+ for i, this := range append(containsBenchTestData, containsAdditionalTestData...) {
+ result := ReaderContains(StringToReader(this.v1), this.v2)
+ if result != this.expect {
+ t.Errorf("[%d] Got %t but expected %t", i, result, this.expect)
+ }
+ }
+}
+
+func BenchmarkReaderContains(b *testing.B) {
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ for i, this := range containsBenchTestData {
+ result := ReaderContains(StringToReader(this.v1), this.v2)
+ if result != this.expect {
+ b.Errorf("[%d] Got %t but expected %t", i, result, this.expect)
+ }
+ }
+ }
+}
+
+// kept to compare the above
+func _BenchmarkReaderContains(b *testing.B) {
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ for i, this := range containsBenchTestData {
+ bs, err := ioutil.ReadAll(StringToReader(this.v1))
+ if err != nil {
+ b.Fatalf("Failed %s", err)
+ }
+ result := bytes.Contains(bs, this.v2)
+ if result != this.expect {
+ b.Errorf("[%d] Got %t but expected %t", i, result, this.expect)
+ }
+ }
+ }
+}
+
func TestFindAvailablePort(t *testing.T) {
addr, err := FindAvailablePort()
assert.Nil(t, err)