shithub: hugo

Download patch

ref: e26b43f6d9f70470ac7c4a9ec333569585495272
parent: e67db666c8e4d9c62ef3edae3fdd523566eba91c
author: Noah Campbell <[email protected]>
date: Tue Aug 6 19:04:49 EDT 2013

Adding more test cases

--- a/hugolib/benchmark_test.go
+++ b/hugolib/benchmark_test.go
@@ -1,8 +1,8 @@
 package hugolib
 
 import (
-	"os"
 	"bytes"
+	"os"
 	"testing"
 )
 
@@ -12,7 +12,7 @@
 	sample.ReadFrom(f)
 	b.ResetTimer()
 	for i := 0; i < b.N; i++ {
-		ReadFrom(sample, "bench")	
+		ReadFrom(sample, "bench")
 	}
 }
 
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -303,25 +303,28 @@
 	return nil
 }
 
-// TODO return error on last line instead of nil
+var ErrDetectingFrontMatter = errors.New("unable to detect front matter")
+var ErrMatchingStartingFrontMatterDelimiter = errors.New("unable to match beginning front matter delimiter")
+var ErrMatchingEndingFrontMatterDelimiter = errors.New("unable to match ending front matter delimiter")
+
 func (page *Page) parseFrontMatter(data *bufio.Reader) (err error) {
 
 	if err = checkEmpty(data); err != nil {
-		return err
+		return
 	}
 
 	var mark rune
 	if mark, err = chompWhitespace(data); err != nil {
-		return err
+		return
 	}
 
 	f := page.detectFrontMatter(mark)
 	if f == nil {
-		return errors.New("unable to match beginning front matter delimiter")
+		return ErrDetectingFrontMatter
 	}
 
 	if found, err := beginFrontMatter(data, f); err != nil || !found {
-		return errors.New("unable to match beginning front matter delimiter")
+		return ErrMatchingStartingFrontMatterDelimiter
 	}
 
 	var frontmatter = new(bytes.Buffer)
@@ -329,13 +332,18 @@
 		line, _, err := data.ReadLine()
 		if err != nil {
 			if err == io.EOF {
-				return errors.New("unable to match ending front matter delimiter")
+				return ErrMatchingEndingFrontMatterDelimiter
 			}
 			return err
 		}
+
 		if bytes.Equal(line, f.markend) {
+			if f.includeMark {
+				frontmatter.Write(line)
+			}
 			break
 		}
+
 		frontmatter.Write(line)
 		frontmatter.Write([]byte{'\n'})
 	}
@@ -342,11 +350,11 @@
 
 	metadata, err := f.parse(frontmatter.Bytes())
 	if err != nil {
-		return err
+		return
 	}
 
 	if err = page.update(metadata); err != nil {
-		return err
+		return
 	}
 
 	return
@@ -365,16 +373,17 @@
 type frontmatterType struct {
 	markstart, markend []byte
 	parse              func([]byte) (interface{}, error)
+	includeMark        bool
 }
 
 func (page *Page) detectFrontMatter(mark rune) (f *frontmatterType) {
 	switch mark {
 	case '-':
-		return &frontmatterType{[]byte{'-', '-', '-'}, []byte{'-', '-', '-'}, page.handleYamlMetaData}
+		return &frontmatterType{[]byte{'-', '-', '-'}, []byte{'-', '-', '-'}, page.handleYamlMetaData, false}
 	case '+':
-		return &frontmatterType{[]byte{'+', '+', '+'}, []byte{'+', '+', '+'}, page.handleTomlMetaData}
+		return &frontmatterType{[]byte{'+', '+', '+'}, []byte{'+', '+', '+'}, page.handleTomlMetaData, false}
 	case '{':
-		return &frontmatterType{[]byte{'{'}, []byte{'}'}, page.handleJsonMetaData}
+		return &frontmatterType{[]byte{'{'}, []byte{'}'}, page.handleJsonMetaData, true}
 	default:
 		return nil
 	}
@@ -381,8 +390,14 @@
 }
 
 func beginFrontMatter(data *bufio.Reader, f *frontmatterType) (bool, error) {
-	peek := make([]byte, 3)
-	_, err := data.Read(peek)
+	var err error
+	var peek []byte
+	if f.includeMark {
+		peek, err = data.Peek(len(f.markstart))
+	} else {
+		peek = make([]byte, len(f.markstart))
+		_, err = data.Read(peek)
+	}
 	if err != nil {
 		return false, err
 	}
--- a/hugolib/page_test.go
+++ b/hugolib/page_test.go
@@ -39,6 +39,36 @@
 Leading
 `
 
+var SIMPLE_PAGE_JSON = `
+{
+"title": "spf13-vim 3.0 release and new website",
+"description": "spf13-vim is a cross platform distribution of vim plugins and resources for Vim.",
+"tags": [ ".vimrc", "plugins", "spf13-vim", "vim" ],
+"date": "2012-04-06",
+"categories": [
+    "Development",
+    "VIM"
+],
+"slug": "spf13-vim-3-0-release-and-new-website"
+}
+
+Content of the file goes Here 
+`
+
+var SIMPLE_PAGE_JSON_MULTIPLE = `
+{
+	"title": "foobar",
+	"customData": { "foo": "bar" },
+	"date": "2012-08-06"
+}
+Some text
+`
+
+var SIMPLE_PAGE_JSON_COMPACT = `
+{"title":"foobar","customData":{"foo":"bar"},"date":"2012-08-06"}
+Text
+`
+
 func checkError(t *testing.T, err error, expected string) {
 	if err == nil {
 		t.Fatalf("err is nil")
@@ -101,6 +131,23 @@
 	checkPageLayout(t, p, "page/single.html")
 }
 
+func TestCreatePage(t *testing.T) {
+	var tests = []struct {
+		r io.Reader
+	}{
+		{strings.NewReader(SIMPLE_PAGE_JSON)},
+		{strings.NewReader(SIMPLE_PAGE_JSON_MULTIPLE)},
+		//{strings.NewReader(SIMPLE_PAGE_JSON_COMPACT)},
+	}
+
+	for _, test := range tests {
+		_, err := ReadFrom(test.r, "page")
+		if err != nil {
+			t.Errorf("Unable to parse page: %s", err)
+		}
+	}
+}
+
 func TestDegenerateInvalidFrontMatterShortDelim(t *testing.T) {
 	var tests = []struct {
 		r   io.Reader
@@ -108,7 +155,7 @@
 	}{
 		{strings.NewReader(INVALID_FRONT_MATTER_SHORT_DELIM), "unable to match beginning front matter delimiter"},
 		{strings.NewReader(INVALID_FRONT_MATTER_SHORT_DELIM_ENDING), "unable to match ending front matter delimiter"},
-		{strings.NewReader(INVALID_FRONT_MATTER_MISSING), "unable to match beginning front matter delimiter"},
+		{strings.NewReader(INVALID_FRONT_MATTER_MISSING), "unable to detect front matter"},
 	}
 	for _, test := range tests {
 		_, err := ReadFrom(test.r, "invalid/front/matter/short/delim")