package stack
import (
"reflect"
"testing"
"github.com/openshift/origin/tools/junitreport/pkg/api"
)
func TestPush(t *testing.T) {
var testCases = []struct {
name string
stackSeed *testSuiteNode
testSuiteToPush *api.TestSuite
expectedStack *testSuiteNode
}{
{
name: "push on empty stack",
stackSeed: nil,
testSuiteToPush: newTestSuite("test"),
expectedStack: newTestSuiteNode(newTestSuite("test"), nil),
},
{
name: "push on existing stack",
stackSeed: newTestSuiteNode(newTestSuite("test"), nil),
testSuiteToPush: newTestSuite("test2"),
expectedStack: newTestSuiteNode(newTestSuite("test2"), newTestSuiteNode(newTestSuite("test"), nil)),
},
{
name: "push on deep stack",
stackSeed: newTestSuiteNode(newTestSuite("test2"), newTestSuiteNode(newTestSuite("test3"), nil)),
testSuiteToPush: newTestSuite("test1"),
expectedStack: newTestSuiteNode(newTestSuite("test1"), newTestSuiteNode(newTestSuite("test2"), newTestSuiteNode(newTestSuite("test3"), nil))),
},
}
for _, testCase := range testCases {
testStack := &testSuiteStack{
head: testCase.stackSeed,
}
testStack.Push(testCase.testSuiteToPush)
if !reflect.DeepEqual(testStack.head, testCase.expectedStack) {
t.Errorf("%s: did not get correct stack state after push:\n\texpected:\n\t%s\n\tgot:\n\t%s\n", testCase.name, testCase.expectedStack, testStack.head)
}
}
}
func TestPop(t *testing.T) {
var testCases = []struct {
name string
stackSeed *testSuiteNode
expectedTestSuite *api.TestSuite
expectedStack *testSuiteNode
}{
{
name: "pop on empty stack",
stackSeed: nil,
expectedTestSuite: nil,
expectedStack: nil,
},
{
name: "pop on existing stack",
stackSeed: newTestSuiteNode(newTestSuite("test"), nil),
expectedTestSuite: newTestSuite("test"),
expectedStack: nil,
},
{
name: "pop on deep stack",
stackSeed: newTestSuiteNode(newTestSuite("test"), newTestSuiteNode(newTestSuite("test2"), nil)),
expectedTestSuite: newTestSuite("test"),
expectedStack: newTestSuiteNode(newTestSuite("test2"), nil),
},
}
for _, testCase := range testCases {
testStack := &testSuiteStack{
head: testCase.stackSeed,
}
testSuite := testStack.Pop()
if !reflect.DeepEqual(testSuite, testCase.expectedTestSuite) {
t.Errorf("%s: did not get correct package from pop:\n\texpected:\n\t%s\n\tgot:\n\t%s\n", testCase.name, testCase.expectedTestSuite, testSuite)
}
if !reflect.DeepEqual(testStack.head, testCase.expectedStack) {
t.Errorf("%s: did not get correct stack state after pop:\n\texpected:\n\t%s\n\tgot:\n\t%s\n", testCase.name, testCase.expectedStack, testStack.head)
}
}
}
func TestPeek(t *testing.T) {
var testCases = []struct {
name string
stackSeed *testSuiteNode
expectedTestSuite *api.TestSuite
expectedStack *testSuiteNode
}{
{
name: "peek on empty stack",
stackSeed: nil,
expectedTestSuite: nil,
expectedStack: nil,
},
{
name: "peek on existing stack",
stackSeed: newTestSuiteNode(newTestSuite("test"), nil),
expectedTestSuite: newTestSuite("test"),
expectedStack: newTestSuiteNode(newTestSuite("test"), nil),
},
{
name: "peek on deep stack",
stackSeed: newTestSuiteNode(newTestSuite("test"), newTestSuiteNode(newTestSuite("test2"), nil)),
expectedTestSuite: newTestSuite("test"),
expectedStack: newTestSuiteNode(newTestSuite("test"), newTestSuiteNode(newTestSuite("test2"), nil)),
},
}
for _, testCase := range testCases {
testStack := &testSuiteStack{
head: testCase.stackSeed,
}
testSuite := testStack.Peek()
if !reflect.DeepEqual(testSuite, testCase.expectedTestSuite) {
t.Errorf("%s: did not get correct package from pop:\n\texpected:\n\t%s\n\tgot:\n\t%s\n", testCase.name, testCase.expectedTestSuite, testSuite)
}
if !reflect.DeepEqual(testStack.head, testCase.expectedStack) {
t.Errorf("%s: did not get correct stack state after pop:\n\texpected:\n\t%s\n\tgot:\n\t%s\n", testCase.name, testCase.expectedStack, testStack.head)
}
}
}
func TestIsEmpty(t *testing.T) {
var testCases = []struct {
name string
stackSeed *testSuiteNode
expectedState bool
expectedStack *testSuiteNode
}{
{
name: "isempty on empty stack",
stackSeed: nil,
expectedState: true,
expectedStack: nil,
},
{
name: "isempty on existing stack",
stackSeed: newTestSuiteNode(newTestSuite("test"), nil),
expectedState: false,
expectedStack: newTestSuiteNode(newTestSuite("test"), nil),
},
}
for _, testCase := range testCases {
testStack := &testSuiteStack{
head: testCase.stackSeed,
}
state := testStack.IsEmpty()
if state != testCase.expectedState {
t.Errorf("%s: did not get correct stack emptiness after push: expected: %t got: %t\n", testCase.name, testCase.expectedState, state)
}
if !reflect.DeepEqual(testStack.head, testCase.expectedStack) {
t.Errorf("%s: did not get correct stack state after push:\n\texpected:\n\t%s\n\tgot:\n\t%s\n", testCase.name, testCase.expectedStack, testStack.head)
}
}
}
func newTestSuite(name string) *api.TestSuite {
return &api.TestSuite{
Name: name,
}
}
func newTestSuiteNode(testSuite *api.TestSuite, next *testSuiteNode) *testSuiteNode {
return &testSuiteNode{
Member: testSuite,
Next: next,
}
}