| // Copyright 2019 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package main |
| |
| import ( |
| "bytes" |
| "fmt" |
| "reflect" |
| "testing" |
| ) |
| |
| func TestRun(t *testing.T) { |
| out := &bytes.Buffer{} |
| in := bytes.NewBuffer([]byte(` |
| test.com/A@v1.0.0 test.com/B@v1.2.3 |
| test.com/B@v1.0.0 test.com/C@v4.5.6 |
| `)) |
| if err := modgraphviz(in, out); err != nil { |
| t.Fatal(err) |
| } |
| |
| gotGraph := string(out.Bytes()) |
| wantGraph := `digraph gomodgraph { |
| node [ shape=rectangle fontsize=12 ] |
| "test.com/A@v1.0.0" -> "test.com/B@v1.2.3" |
| "test.com/B@v1.0.0" -> "test.com/C@v4.5.6" |
| "test.com/A@v1.0.0" [style = filled, fillcolor = green] |
| "test.com/B@v1.2.3" [style = filled, fillcolor = green] |
| "test.com/C@v4.5.6" [style = filled, fillcolor = green] |
| "test.com/B@v1.0.0" [style = filled, fillcolor = gray] |
| } |
| ` |
| if gotGraph != wantGraph { |
| t.Fatalf("\ngot: %s\nwant: %s", gotGraph, wantGraph) |
| } |
| } |
| |
| func TestMVSPicking(t *testing.T) { |
| for _, tc := range []struct { |
| name string |
| in []string |
| wantPicked []string |
| wantUnpicked []string |
| }{ |
| { |
| name: "single node", |
| in: []string{"foo@v0.0.1"}, |
| wantPicked: []string{"foo@v0.0.1"}, |
| wantUnpicked: nil, |
| }, |
| { |
| name: "duplicate same node", |
| in: []string{"foo@v0.0.1", "foo@v0.0.1"}, |
| wantPicked: []string{"foo@v0.0.1"}, |
| wantUnpicked: nil, |
| }, |
| { |
| name: "multiple semver - same major", |
| in: []string{"foo@v1.0.0", "foo@v1.3.7", "foo@v1.2.0", "foo@v1.0.1"}, |
| wantPicked: []string{"foo@v1.3.7"}, |
| wantUnpicked: []string{"foo@v1.0.0", "foo@v1.2.0", "foo@v1.0.1"}, |
| }, |
| { |
| name: "multiple semver - multiple major", |
| in: []string{"foo@v1.0.0", "foo@v1.3.7", "foo/v2@v2.2.0", "foo/v2@v2.0.1", "foo@v1.1.1"}, |
| wantPicked: []string{"foo/v2@v2.2.0", "foo@v1.3.7"}, |
| wantUnpicked: []string{"foo@v1.0.0", "foo/v2@v2.0.1", "foo@v1.1.1"}, |
| }, |
| { |
| name: "semver and pseudo version", |
| in: []string{"foo@v1.0.0", "foo@v1.3.7", "foo/v2@v2.2.0", "foo/v2@v2.0.1", "foo@v1.1.1", "foo@v0.0.0-20190311183353-d8887717615a"}, |
| wantPicked: []string{"foo/v2@v2.2.0", "foo@v1.3.7"}, |
| wantUnpicked: []string{"foo@v1.0.0", "foo/v2@v2.0.1", "foo@v1.1.1", "foo@v0.0.0-20190311183353-d8887717615a"}, |
| }, |
| { |
| name: "multiple pseudo version", |
| in: []string{ |
| "foo@v0.0.0-20190311183353-d8887717615a", |
| "foo@v0.0.0-20190227222117-0694c2d4d067", |
| "foo@v0.0.0-20190312151545-0bb0c0a6e846", |
| }, |
| wantPicked: []string{"foo@v0.0.0-20190312151545-0bb0c0a6e846"}, |
| wantUnpicked: []string{ |
| "foo@v0.0.0-20190227222117-0694c2d4d067", |
| "foo@v0.0.0-20190311183353-d8887717615a", |
| }, |
| }, |
| { |
| name: "semver and suffix", |
| in: []string{"foo@v1.0.0", "foo@v1.3.8-rc1", "foo@v1.3.7"}, |
| wantPicked: []string{"foo@v1.3.8-rc1"}, |
| wantUnpicked: []string{"foo@v1.0.0", "foo@v1.3.7"}, |
| }, |
| } { |
| t.Run(tc.name, func(t *testing.T) { |
| buf := bytes.Buffer{} |
| for _, node := range tc.in { |
| fmt.Fprintf(&buf, "A %s\n", node) |
| } |
| |
| g, err := convert(&buf) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| if !reflect.DeepEqual(g.mvsPicked, tc.wantPicked) { |
| t.Fatalf("picked: got %v, want %v", g.mvsPicked, tc.wantPicked) |
| } |
| if !reflect.DeepEqual(g.mvsUnpicked, tc.wantUnpicked) { |
| t.Fatalf("unpicked: got %v, want %v", g.mvsUnpicked, tc.wantUnpicked) |
| } |
| }) |
| } |
| } |