1 // Copyright 2018 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
11 "golang.org/x/mod/module"
14 var addRequireTests = []struct {
53 require x.y/q/v2 v2.3.4
67 var setRequireTests = []struct {
92 {"x.y/a", "v1.2.3", false},
93 {"x.y/b", "v1.2.3", false},
94 {"x.y/c", "v1.2.3", false},
112 x.y/e v1.2.3 // indirect
113 x.y/f v1.2.3 //indirect
114 x.y/g v1.2.3 // indirect
122 {"x.y/a", "v1.2.3", true},
123 {"x.y/b", "v1.2.3", true},
124 {"x.y/c", "v1.2.3", true},
125 {"x.y/d", "v1.2.3", true},
126 {"x.y/e", "v1.2.3", true},
127 {"x.y/f", "v1.2.3", true},
128 {"x.y/g", "v1.2.3", true},
132 x.y/a v1.2.3 // indirect
133 x.y/b v1.2.3 // indirect
134 x.y/c v1.2.3 // indirect; c
135 x.y/d v1.2.3 // indirect; c
136 x.y/e v1.2.3 // indirect
137 x.y/f v1.2.3 //indirect
138 x.y/g v1.2.3 // indirect
144 var addGoTests = []struct {
160 `module_before_require`,
171 `require_before_module`,
172 `require x.y/a v1.2.3
173 module example.com/inverted
176 `require x.y/a v1.2.3
177 module example.com/inverted
183 `require x.y/a v1.2.3
186 `require x.y/a v1.2.3
192 var addRetractTests = []struct {
219 retract [v1.0.0, v1.1.0]`,
222 `duplicate_with_rationale`,
238 `duplicate_multiline_rationale`,
240 retract [v1.2.3, v1.2.3]
256 `duplicate_interval`,
258 retract [v1.0.0, v1.1.0]
271 `duplicate_singleton`,
287 var dropRetractTests = []struct {
295 `singleton_no_match`,
306 `singleton_match_one`,
320 `singleton_match_all`,
322 retract v1.2.3 // first
323 retract v1.2.3 // second
333 retract [v1.2.3, v1.2.3]
341 `interval_superset_no_match`,
343 retract [v1.0.0, v1.1.0]
348 retract [v1.0.0, v1.1.0]
352 `singleton_match_middle`,
362 `interval_match_middle_block`,
380 `interval_match_all`,
382 retract [v1.0.0, v1.1.0]
383 retract [v1.0.0, v1.1.0]
392 var retractRationaleTests = []struct {
393 desc, in, want string
427 retract v1.0.0 // suffix
432 `prefix_suffix_after`,
435 retract v1.0.0 // suffix
461 var sortBlocksTests = []struct {
466 `exclude_duplicates_removed`,
468 exclude x.y/z v1.0.0 // a
469 exclude x.y/z v1.0.0 // b
476 exclude x.y/z v1.0.0 // a
483 `replace_duplicates_removed`,
485 replace x.y/z v1.0.0 => ./a
486 replace x.y/z v1.1.0 => ./b
492 replace x.y/z v1.1.0 => ./b
500 `retract_duplicates_not_removed`,
515 // Tests below this point just check sort order.
516 // Non-retract blocks are sorted lexicographically in ascending order.
517 // retract blocks are sorted using semver in descending order.
519 `sort_lexicographically`,
571 var addRetractValidateVersionTests = []struct {
572 dsc, low, high string
596 var addExcludeValidateVersionTests = []struct {
613 func TestAddRequire(t *testing.T) {
614 for _, tt := range addRequireTests {
615 t.Run(tt.desc, func(t *testing.T) {
616 testEdit(t, tt.in, tt.out, true, func(f *File) error {
617 return f.AddRequire(tt.path, tt.vers)
623 func TestSetRequire(t *testing.T) {
624 for _, tt := range setRequireTests {
625 t.Run(tt.desc, func(t *testing.T) {
627 for _, mod := range tt.mods {
628 mods = append(mods, &Require{
633 Indirect: mod.indirect,
637 f := testEdit(t, tt.in, tt.out, true, func(f *File) error {
643 if len(f.Require) != len(mods) {
644 t.Errorf("after Cleanup, len(Require) = %v; want %v", len(f.Require), len(mods))
650 func TestAddGo(t *testing.T) {
651 for _, tt := range addGoTests {
652 t.Run(tt.desc, func(t *testing.T) {
653 testEdit(t, tt.in, tt.out, true, func(f *File) error {
654 return f.AddGoStmt(tt.version)
660 func TestAddRetract(t *testing.T) {
661 for _, tt := range addRetractTests {
662 t.Run(tt.desc, func(t *testing.T) {
663 testEdit(t, tt.in, tt.out, true, func(f *File) error {
664 return f.AddRetract(VersionInterval{Low: tt.low, High: tt.high}, tt.rationale)
670 func TestDropRetract(t *testing.T) {
671 for _, tt := range dropRetractTests {
672 t.Run(tt.desc, func(t *testing.T) {
673 testEdit(t, tt.in, tt.out, true, func(f *File) error {
674 if err := f.DropRetract(VersionInterval{Low: tt.low, High: tt.high}); err != nil {
684 func TestRetractRationale(t *testing.T) {
685 for _, tt := range retractRationaleTests {
686 t.Run(tt.desc, func(t *testing.T) {
687 f, err := Parse("in", []byte(tt.in), nil)
691 if len(f.Retract) != 1 {
692 t.Fatalf("got %d retract directives; want 1", len(f.Retract))
694 if got := f.Retract[0].Rationale; got != tt.want {
695 t.Errorf("got %q; want %q", got, tt.want)
701 func TestSortBlocks(t *testing.T) {
702 for _, tt := range sortBlocksTests {
703 t.Run(tt.desc, func(t *testing.T) {
704 testEdit(t, tt.in, tt.out, tt.strict, func(f *File) error {
712 func testEdit(t *testing.T, in, want string, strict bool, transform func(f *File) error) *File {
718 f, err := parse("in", []byte(in), nil)
722 g, err := parse("out", []byte(want), nil)
726 golden, err := g.Format()
731 if err := transform(f); err != nil {
734 out, err := f.Format()
738 if !bytes.Equal(out, golden) {
739 t.Errorf("have:\n%s\nwant:\n%s", out, golden)
745 func TestAddRetractValidateVersion(t *testing.T) {
746 for _, tt := range addRetractValidateVersionTests {
747 t.Run(tt.dsc, func(t *testing.T) {
748 f, err := Parse("in", []byte("module m"), nil)
752 if err = f.AddRetract(VersionInterval{Low: tt.low, High: tt.high}, ""); err == nil {
753 t.Fatal("expected AddRetract to complain about version format")
759 func TestAddExcludeValidateVersion(t *testing.T) {
760 for _, tt := range addExcludeValidateVersionTests {
761 t.Run(tt.dsc, func(t *testing.T) {
762 f, err := Parse("in", []byte("module m"), nil)
766 if err = f.AddExclude("aa", tt.ver); err == nil {
767 t.Fatal("expected AddExclude to complain about version format")