Skip to content

Commit

Permalink
Merge pull request #672 from leenipper/bracket-push-create-test-case-…
Browse files Browse the repository at this point in the history
…generator

bracket-push: create test case generator
  • Loading branch information
leenipper authored May 12, 2017
2 parents d8be29f + 86947b4 commit e38a1a4
Show file tree
Hide file tree
Showing 4 changed files with 146 additions and 59 deletions.
49 changes: 49 additions & 0 deletions exercises/bracket-push/.meta/gen.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// +build ignore

package main

import (
"log"
"text/template"

"../../../gen"
)

func main() {
t, err := template.New("").Parse(tmpl)
if err != nil {
log.Fatal(err)
}
var j js
if err := gen.Gen("bracket-push", &j, t); err != nil {
log.Fatal(err)
}
}

// The JSON structure we expect to be able to unmarshal into
type js struct {
Cases []struct {
Description string
Input string
Expected bool
}
}

// template applied to above data structure generates the Go test cases
var tmpl = `package brackets
{{.Header}}
type bracketTest struct {
input string
expected bool
}
var testCases = []bracketTest {
{{range .J.Cases}}{
// {{.Description}}
{{printf "%q" .Input}},
{{.Expected}},
},
{{end}}}
`
44 changes: 1 addition & 43 deletions exercises/bracket-push/bracket_push_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,49 +4,7 @@ import (
"testing"
)

const targetTestVersion = 4

var testCases = []struct {
input string
expected bool
}{
{
input: "",
expected: true,
},
{
input: "{}",
expected: true,
},
{
input: "{{",
expected: false,
},
{
input: "}{",
expected: false,
},
{
input: "{}[]",
expected: true,
},
{
input: "{[]}",
expected: true,
},
{
input: "{[}]",
expected: false,
},
{
input: "{[)][]}",
expected: false,
},
{
input: "{[]([()])}",
expected: true,
},
}
const targetTestVersion = 5

func TestTestVersion(t *testing.T) {
if testVersion != targetTestVersion {
Expand Down
83 changes: 83 additions & 0 deletions exercises/bracket-push/cases_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package brackets

// Source: exercism/x-common
// Commit: 855c591 bracket-push: add test case (#747)
// x-common version: 1.1.0

type bracketTest struct {
input string
expected bool
}

var testCases = []bracketTest{
{
// paired square brackets
"[]",
true,
},
{
// empty string
"",
true,
},
{
// unpaired brackets
"[[",
false,
},
{
// wrong ordered brackets
"}{",
false,
},
{
// wrong closing bracket
"{]",
false,
},
{
// paired with whitespace
"{ }",
true,
},
{
// simple nested brackets
"{[]}",
true,
},
{
// several paired brackets
"{}[]",
true,
},
{
// paired and nested brackets
"([{}({}[])])",
true,
},
{
// unopened closing brackets
"{[)][]}",
false,
},
{
// unpaired and nested brackets
"([{])",
false,
},
{
// paired and wrong nested brackets
"[({]})",
false,
},
{
// math expression
"(((185 + 223.85) * 15) - 543)/2",
true,
},
{
// complex latex expression
"\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \\end{array}\\right)",
true,
},
}
29 changes: 13 additions & 16 deletions exercises/bracket-push/example.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
package brackets

import (
"fmt"
)

// testVersion shows the version of the exercise.
const testVersion = 4
const testVersion = 5

type bracketKind int

const (
kindParen bracketKind = iota
kindSquare bracketKind = iota
kindBrace bracketKind = iota
kindOther bracketKind = iota
)

// Whether a bracket is an opening or closing bracket
Expand All @@ -33,9 +30,9 @@ type charInfo struct {
func Bracket(input string) (bool, error) {
var stack []bracketKind
for _, char := range input {
ci, err := info(char)
if err != nil {
return false, err
ci := info(char)
if ci.kind == kindOther {
continue
}
if ci.form == formOpen {
stack = append(stack, ci.kind)
Expand All @@ -52,21 +49,21 @@ func Bracket(input string) (bool, error) {
return len(stack) == 0, nil
}

func info(char rune) (charInfo, error) {
func info(char rune) charInfo {
switch char {
case '(':
return charInfo{kind: kindParen, form: formOpen}, nil
return charInfo{kind: kindParen, form: formOpen}
case '[':
return charInfo{kind: kindSquare, form: formOpen}, nil
return charInfo{kind: kindSquare, form: formOpen}
case '{':
return charInfo{kind: kindBrace, form: formOpen}, nil
return charInfo{kind: kindBrace, form: formOpen}
case ')':
return charInfo{kind: kindParen, form: formClose}, nil
return charInfo{kind: kindParen, form: formClose}
case ']':
return charInfo{kind: kindSquare, form: formClose}, nil
return charInfo{kind: kindSquare, form: formClose}
case '}':
return charInfo{kind: kindBrace, form: formClose}, nil
return charInfo{kind: kindBrace, form: formClose}
default:
return charInfo{}, fmt.Errorf("Unknown bracket %v", char)
return charInfo{kind: kindOther}
}
}

0 comments on commit e38a1a4

Please sign in to comment.