mccurdyc/splitfile

View on GitHub
internal/graph/graph_test.go

Summary

Maintainability
B
4 hrs
Test Coverage
package graph

import (
    "reflect"
    "testing"

    "github.com/google/go-cmp/cmp"
    "github.com/pkg/errors"
)

func TestNew(t *testing.T) {
    tests := []struct {
        name string
        want Graph
    }{
        {
            name: "empty relations map",
            want: Graph(map[string]*Node{}),
        },
    }

    for _, test := range tests {
        t.Run(test.name, func(t *testing.T) {
            got := New()

            if !reflect.DeepEqual(got, test.want) {
                t.Errorf("New() = %+v mismatch:\n%+v", got, test.want)
            }
        })
    }
}

var (
    edgeB = map[string]WeightedEdge{
        "b": WeightedEdge{
            Weight: 1.0,
            Dest:   &Node{ID: "b", Edges: make(map[string]WeightedEdge)},
        },
    }

    nodeAWithSingleEdgeB = Node{ID: "a", Edges: edgeB}
    nodeCWithSingleEdgeB = Node{ID: "c", Edges: edgeB}
)

func TestAddNode(t *testing.T) {
    tests := []struct {
        name    string
        graph   Graph
        node    *Node
        want    Graph
        wantErr error
    }{
        {
            name:    "add-nil-node-to-empty-graph-should-return-empty-graph",
            graph:   Graph(map[string]*Node{}),
            node:    &Node{},
            want:    Graph(map[string]*Node{}),
            wantErr: errors.New("could not add invalid node: invalid node; node cannot be nil"),
        },

        {
            name:    "add-node-with-nil-ID-to-empty-graph-should-return-empty-graph",
            graph:   Graph(map[string]*Node{}),
            node:    &Node{ID: ""},
            want:    Graph(map[string]*Node{}),
            wantErr: errors.New("could not add invalid node: invalid node; node must have an ID"),
        },

        {
            name:    "add-node-with-nil-edge-map-to-empty-graph-should-return-empty-graph",
            graph:   Graph(map[string]*Node{}),
            node:    &Node{ID: "abc"},
            want:    Graph(map[string]*Node{}),
            wantErr: errors.New("could not add invalid node: invalid node; edge map must be initialized"),
        },

        {
            name:    "add-valid-node-to-empty-graph-should-return-graph-with-that-node",
            graph:   Graph(map[string]*Node{}),
            node:    &nodeAWithSingleEdgeB,
            want:    Graph(map[string]*Node{"a": &nodeAWithSingleEdgeB}),
            wantErr: nil,
        },

        {
            name:    "add-duplicate-node-to-graph-should-return-same-graph",
            graph:   Graph(map[string]*Node{"a": &nodeAWithSingleEdgeB}),
            node:    &nodeAWithSingleEdgeB,
            want:    Graph(map[string]*Node{"a": &nodeAWithSingleEdgeB}),
            wantErr: nil,
        },

        {
            name:    "add-valid-node-to-non-empty-graph-should-return-graph-with-new-node-added",
            graph:   Graph(map[string]*Node{"a": &nodeAWithSingleEdgeB}),
            node:    &nodeCWithSingleEdgeB,
            want:    Graph(map[string]*Node{"a": &nodeAWithSingleEdgeB, "c": &nodeCWithSingleEdgeB}),
            wantErr: nil,
        },
    }

    for _, test := range tests {
        t.Run(test.name, func(t *testing.T) {
            gotErr := test.graph.AddNode(test.node)

            if (gotErr == nil && test.wantErr != nil) || (gotErr != nil && test.wantErr == nil) {
                t.Errorf("(%+v) AddNode(%+v) = '%v' wantErr '%v'", test.graph, test.node, gotErr, test.wantErr)
            }

            if diff := cmp.Diff(test.want, test.graph); diff != "" {
                t.Errorf("(%+v) AddNode(%+v) mismatch (-want +got):\n%s", test.graph, test.node, diff)
            }
        })
    }
}

func TestContainsNode(t *testing.T) {
    tests := []struct {
        name  string
        graph Graph
        id    string
        want  bool
    }{
        {
            name:  "contains-node-should-return-true",
            graph: Graph(map[string]*Node{"a": &nodeAWithSingleEdgeB}),
            id:    "a",
            want:  true,
        },

        {
            name:  "doesnt-contain-node-should-return-false",
            graph: Graph(map[string]*Node{"a": &nodeAWithSingleEdgeB}),
            id:    "b",
            want:  false,
        },

        {
            name:  "empty-graph-should-return-false",
            graph: Graph(map[string]*Node{}),
            id:    "a",
            want:  false,
        },
    }

    for _, test := range tests {
        t.Run(test.name, func(t *testing.T) {
            got := test.graph.ContainsNode(test.id)

            if got != test.want {
                t.Errorf("(%+v) ContainsNode(%v) = %v mismatch \n%v", test.graph, test.id, got, test.want)
            }
        })
    }
}