mirror of
				https://github.com/redhat-developer/odo.git
				synced 2025-10-19 03:06:19 +03:00 
			
		
		
		
	Use go-cmp instead of reflect.DeepEqual to compare unit test results (#6343)
This commit is contained in:
		
							
								
								
									
										7
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								go.mod
									
									
									
									
									
								
							| @@ -17,11 +17,13 @@ require ( | ||||
| 	github.com/fsnotify/fsnotify v1.5.1 | ||||
| 	github.com/ghodss/yaml v1.0.0 | ||||
| 	github.com/go-git/go-git/v5 v5.3.0 | ||||
| 	github.com/go-openapi/jsonpointer v0.19.5 | ||||
| 	github.com/go-openapi/jsonreference v0.19.5 | ||||
| 	github.com/go-openapi/spec v0.19.5 | ||||
| 	github.com/golang/mock v1.6.0 | ||||
| 	github.com/google/go-cmp v0.5.9 | ||||
| 	github.com/jedib0t/go-pretty/v6 v6.3.5 | ||||
| 	github.com/kubernetes-sigs/service-catalog v0.3.1 | ||||
| 	github.com/kylelemons/godebug v1.1.0 | ||||
| 	github.com/mattn/go-colorable v0.1.13 | ||||
| 	github.com/olekukonko/tablewriter v0.0.5 | ||||
| 	github.com/onsi/ginkgo v1.16.5 | ||||
| @@ -106,8 +108,6 @@ require ( | ||||
| 	github.com/go-git/gcfg v1.5.0 // indirect | ||||
| 	github.com/go-git/go-billy/v5 v5.1.0 // indirect | ||||
| 	github.com/go-logr/logr v1.2.2 // indirect | ||||
| 	github.com/go-openapi/jsonpointer v0.19.5 // indirect | ||||
| 	github.com/go-openapi/jsonreference v0.19.5 // indirect | ||||
| 	github.com/go-openapi/swag v0.19.14 // indirect | ||||
| 	github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect | ||||
| 	github.com/gobwas/glob v0.2.3 // indirect | ||||
| @@ -117,7 +117,6 @@ require ( | ||||
| 	github.com/golang/protobuf v1.5.2 // indirect | ||||
| 	github.com/google/btree v1.0.1 // indirect | ||||
| 	github.com/google/gnostic v0.5.7-v3refs // indirect | ||||
| 	github.com/google/go-cmp v0.5.8 // indirect | ||||
| 	github.com/google/gofuzz v1.2.0 // indirect | ||||
| 	github.com/google/licensecheck v0.3.1 // indirect | ||||
| 	github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect | ||||
|   | ||||
							
								
								
									
										5
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								go.sum
									
									
									
									
									
								
							| @@ -609,8 +609,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ | ||||
| github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= | ||||
| github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= | ||||
| github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= | ||||
| github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= | ||||
| github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||
| github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||
| github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= | ||||
| @@ -784,7 +784,6 @@ github.com/kubernetes-sigs/service-catalog v0.3.1 h1:jgE7b16OqBjxG3BScxqQYl5zkx7 | ||||
| github.com/kubernetes-sigs/service-catalog v0.3.1/go.mod h1:MUAf+rdT06kiNpLXRAIqtPHC3Kgkw63YziVj1VMu3HM= | ||||
| github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= | ||||
| github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= | ||||
| github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= | ||||
| github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= | ||||
| github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= | ||||
| github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= | ||||
|   | ||||
| @@ -2,14 +2,15 @@ package binding | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" | ||||
| 	"github.com/devfile/library/pkg/devfile/parser" | ||||
| 	devfileCtx "github.com/devfile/library/pkg/devfile/parser/context" | ||||
| 	"github.com/devfile/library/pkg/testingutil/filesystem" | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/kylelemons/godebug/pretty" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	"github.com/google/go-cmp/cmp/cmpopts" | ||||
| 	appsv1 "k8s.io/api/apps/v1" | ||||
| 	"k8s.io/apimachinery/pkg/api/meta" | ||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| @@ -65,8 +66,9 @@ func TestBindingClient_GetFlags(t *testing.T) { | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			o := &BindingClient{} | ||||
| 			if got := o.GetFlags(tt.args.flags); !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("GetFlags() = %v, want %v", got, tt.want) | ||||
| 			got := o.GetFlags(tt.args.flags) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("BindingClient.GetFlags() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -209,8 +211,8 @@ func TestBindingClient_GetServiceInstances(t *testing.T) { | ||||
| 				t.Errorf("GetServiceInstances() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("GetServiceInstances() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("BindingClient.GetServiceInstances() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -408,8 +410,10 @@ func TestBindingClient_AddBindingToDevfile(t *testing.T) { | ||||
| 				t.Errorf("AddBindingToDevfile() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, *tt.want) { | ||||
| 				t.Errorf("AddBindingToDevfile(): %v", pretty.Compare(got, tt.want)) | ||||
| 			if diff := cmp.Diff(*tt.want, got, | ||||
| 				cmp.AllowUnexported(devfileCtx.DevfileCtx{}), | ||||
| 				cmpopts.IgnoreInterfaces(struct{ filesystem.Filesystem }{})); diff != "" { | ||||
| 				t.Errorf("BindingClient.AddBindingToDevfile() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,12 +1,11 @@ | ||||
| package binding | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/devfile/library/pkg/devfile/parser" | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/kylelemons/godebug/pretty" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/api" | ||||
| 	"github.com/redhat-developer/odo/pkg/kclient" | ||||
| @@ -226,11 +225,11 @@ func TestBindingClient_ListAllBindings(t *testing.T) { | ||||
| 				t.Errorf("BindingClient.ListAllBindings() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("BindingClient.ListAllBindings(): %v ", pretty.Compare(got, tt.want)) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("BindingClient.ListAllBindings() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(gotInDevfile, tt.wantInDevfile) { | ||||
| 				t.Errorf("BindingClient.ListAllBindings(): %v", pretty.Compare(gotInDevfile, tt.wantInDevfile)) | ||||
| 			if diff := cmp.Diff(tt.wantInDevfile, gotInDevfile); diff != "" { | ||||
| 				t.Errorf("BindingClient.ListAllBindings() wantInDevfile mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,10 +1,11 @@ | ||||
| package binding | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/devfile/library/pkg/devfile/parser" | ||||
| 	devfileCtx "github.com/devfile/library/pkg/devfile/parser/context" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	odoTestingUtil "github.com/redhat-developer/odo/pkg/testingutil" | ||||
| ) | ||||
| @@ -95,8 +96,8 @@ func TestBindingClient_RemoveBinding(t *testing.T) { | ||||
| 				t.Errorf("RemoveBinding() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("RemoveBinding() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got, cmp.AllowUnexported(devfileCtx.DevfileCtx{})); diff != "" { | ||||
| 				t.Errorf("BindingClient.RemoveBinding() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -6,7 +6,6 @@ import ( | ||||
| 	"os" | ||||
| 	"path" | ||||
| 	"path/filepath" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	devfilepkg "github.com/devfile/api/v2/pkg/devfile" | ||||
| @@ -17,7 +16,7 @@ import ( | ||||
| 	"github.com/devfile/library/pkg/testingutil/filesystem" | ||||
| 	dfutil "github.com/devfile/library/pkg/util" | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/kylelemons/godebug/pretty" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	v12 "github.com/openshift/api/route/v1" | ||||
| 	v1 "k8s.io/api/networking/v1" | ||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| @@ -170,8 +169,8 @@ func TestListAllClusterComponents(t *testing.T) { | ||||
| 				t.Errorf("ListAllClusterComponents error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("ListAllClusterComponents got = %+v\nwant = %+v\ncomparison:\n %v", got, tt.want, pretty.Compare(got, tt.want)) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("ListAllClusterComponents() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -361,8 +360,8 @@ func TestGetRunningModes(t *testing.T) { | ||||
| 				t.Errorf("error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("GetRunningModes() = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("GetRunningModes() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -488,8 +487,8 @@ func TestGatherName(t *testing.T) { | ||||
| 				t.Errorf("error = %v, wantErr %v", err, tt.wantErr) | ||||
| 			} | ||||
| 			want := tt.want(dir, d) | ||||
| 			if !reflect.DeepEqual(got, want) { | ||||
| 				t.Errorf("GatherName() = %q, want = %q", got, want) | ||||
| 			if diff := cmp.Diff(want, got); diff != "" { | ||||
| 				t.Errorf("GatherName() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -673,11 +672,11 @@ func TestListRoutesAndIngresses(t *testing.T) { | ||||
| 				t.Errorf("ListRoutesAndIngresses() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(gotIngs, tt.wantIngs) { | ||||
| 				t.Errorf("ListRoutesAndIngresses() gotIngs = %v, want %v", gotIngs, tt.wantIngs) | ||||
| 			if diff := cmp.Diff(tt.wantIngs, gotIngs); diff != "" { | ||||
| 				t.Errorf("ListRoutesAndIngresses() wantIngs mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(gotRoutes, tt.wantRoutes) { | ||||
| 				t.Errorf("ListRoutesAndIngresses() gotRoutes = %v, want %v", gotRoutes, tt.wantRoutes) | ||||
| 			if diff := cmp.Diff(tt.wantRoutes, gotRoutes); diff != "" { | ||||
| 				t.Errorf("ListRoutesAndIngresses() wantRoutes mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -3,12 +3,12 @@ package delete | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/devfile/library/pkg/devfile/parser" | ||||
| 	"github.com/devfile/library/pkg/testingutil/filesystem" | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	appsv1 "k8s.io/api/apps/v1" | ||||
| 	corev1 "k8s.io/api/core/v1" | ||||
| 	kerrors "k8s.io/apimachinery/pkg/api/errors" | ||||
| @@ -123,8 +123,8 @@ func TestDeleteComponentClient_ListClusterResourcesToDelete(t *testing.T) { | ||||
| 				t.Errorf("DeleteComponentClient.ListResourcesToDelete() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("DeleteComponentClient.ListResourcesToDelete() = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("DeleteComponentClient.ListClusterResourcesToDelete() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -234,8 +234,9 @@ func TestDeleteComponentClient_DeleteResources(t *testing.T) { | ||||
| 			kubeClient := tt.fields.kubeClient(ctrl) | ||||
| 			execClient := exec.NewExecClient(kubeClient) | ||||
| 			do := NewDeleteComponentClient(kubeClient, execClient) | ||||
| 			if got := do.DeleteResources(tt.args.resources, false); !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("DeleteComponentClient.DeleteResources() = %v, want %v", got, tt.want) | ||||
| 			got := do.DeleteResources(tt.args.resources, false) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("DeleteComponentClient.DeleteResources() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -557,8 +558,8 @@ func TestDeleteComponentClient_ListResourcesToDeleteFromDevfile(t *testing.T) { | ||||
| 			if gotIsInnerLoopDeployed != tt.wantIsInnerLoopDeployed { | ||||
| 				t.Errorf("ListResourcesToDeleteFromDevfile() gotIsInnerLoopDeployed = %v, want %v", gotIsInnerLoopDeployed, tt.wantIsInnerLoopDeployed) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(gotResources, tt.wantResources) { | ||||
| 				t.Errorf("ListResourcesToDeleteFromDevfile() gotResources = %v, want %v", gotResources, tt.wantResources) | ||||
| 			if diff := cmp.Diff(tt.wantResources, gotResources); diff != "" { | ||||
| 				t.Errorf("DeleteComponentClient.ListResourcesToDeleteFromDevfile() wantResources mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -6,7 +6,8 @@ import ( | ||||
| 	"github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" | ||||
| 	"github.com/devfile/library/pkg/devfile/parser" | ||||
| 	"github.com/devfile/library/pkg/devfile/parser/data" | ||||
| 	"github.com/kylelemons/godebug/pretty" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	"github.com/google/go-cmp/cmp/cmpopts" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/api" | ||||
| 	"github.com/redhat-developer/odo/pkg/labels" | ||||
| @@ -14,7 +15,6 @@ import ( | ||||
| 	"github.com/redhat-developer/odo/pkg/version" | ||||
|  | ||||
| 	corev1 "k8s.io/api/core/v1" | ||||
| 	"k8s.io/apimachinery/pkg/api/equality" | ||||
| 	"k8s.io/apimachinery/pkg/api/resource" | ||||
| 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| 	"k8s.io/utils/pointer" | ||||
| @@ -336,12 +336,12 @@ func Test_createPodFromComponent(t *testing.T) { | ||||
| 				t.Errorf("createPodFromComponent() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			want := tt.wantPod() | ||||
| 			if !equality.Semantic.DeepEqual(got, want) { | ||||
| 				t.Errorf("createPodFromComponent() pod: %s", pretty.Compare(want, got)) | ||||
|  | ||||
| 			if diff := cmp.Diff(tt.wantPod(), got, cmpopts.EquateEmpty()); diff != "" { | ||||
| 				t.Errorf("createPodFromComponent() pod mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 			if !equality.Semantic.DeepEqual(gotFwPorts, tt.wantFwPorts) { | ||||
| 				t.Errorf("createPodFromComponent() fwPorts: %s", pretty.Compare(tt.wantFwPorts, gotFwPorts)) | ||||
| 			if diff := cmp.Diff(tt.wantFwPorts, gotFwPorts, cmpopts.EquateEmpty()); diff != "" { | ||||
| 				t.Errorf("createPodFromComponent() fwPorts mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| package component | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/devfile/library/pkg/devfile/generator" | ||||
| 	"github.com/devfile/library/pkg/devfile/parser/data" | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/libdevfile" | ||||
| 	"github.com/redhat-developer/odo/pkg/preference" | ||||
| @@ -238,8 +238,8 @@ func TestAdapter_generateDeploymentObjectMeta(t *testing.T) { | ||||
| 				t.Errorf("generateDeploymentObjectMeta() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("generateDeploymentObjectMeta() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("Adapter.generateDeploymentObjectMeta() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| package storage | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	devfilev1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" | ||||
| @@ -10,10 +9,12 @@ import ( | ||||
| 	devfileParser "github.com/devfile/library/pkg/devfile/parser" | ||||
| 	"github.com/devfile/library/pkg/devfile/parser/data" | ||||
| 	parsercommon "github.com/devfile/library/pkg/devfile/parser/data/v2/common" | ||||
| 	"github.com/redhat-developer/odo/pkg/testingutil" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	corev1 "k8s.io/api/core/v1" | ||||
| 	v1 "k8s.io/api/core/v1" | ||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/testingutil" | ||||
| ) | ||||
|  | ||||
| func TestGetPVC(t *testing.T) { | ||||
| @@ -138,12 +139,11 @@ func TestGetVolumeInfos(t *testing.T) { | ||||
| 			if err != nil { | ||||
| 				return | ||||
| 			} | ||||
| 			if odoSourcePVCName != tt.wantOdoSourcePVCName { | ||||
| 				t.Errorf("Got odoSource PVC name %v, expected %v", odoSourcePVCName, tt.wantOdoSourcePVCName) | ||||
| 			if diff := cmp.Diff(tt.wantOdoSourcePVCName, odoSourcePVCName); diff != "" { | ||||
| 				t.Errorf("GetVolumeInfos() wantOdoSourcePVCName mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(infos, tt.wantInfos) { | ||||
| 				t.Errorf("Got infos %v, expected %v", infos, tt.wantInfos) | ||||
|  | ||||
| 			if diff := cmp.Diff(tt.wantInfos, infos); diff != "" { | ||||
| 				t.Errorf("GetVolumeInfos() wantInfos mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| package utils | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/devfile/library/pkg/devfile/parser/data" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/storage" | ||||
| 	"github.com/redhat-developer/odo/pkg/util" | ||||
| @@ -472,13 +472,11 @@ func TestUpdateContainersEntrypointsIfNeeded(t *testing.T) { | ||||
| 					t.Errorf("empty command for container %q", c.Args) | ||||
| 				} | ||||
|  | ||||
| 				if !reflect.DeepEqual(tt.expectedContainerCommand[c.Name], c.Command) { | ||||
| 					t.Errorf("unexpected command for container %q, expected=%v, got %v", | ||||
| 						c.Name, tt.expectedContainerCommand[c.Name], c.Command) | ||||
| 				if diff := cmp.Diff(tt.expectedContainerCommand[c.Name], c.Command); diff != "" { | ||||
| 					t.Errorf("UpdateContainersEntrypointsIfNeeded() expectedContainerCommand[%s] mismatch (-want +got):\n%s", c.Name, diff) | ||||
| 				} | ||||
| 				if !reflect.DeepEqual(tt.expectedContainerArgs[c.Name], c.Args) { | ||||
| 					t.Errorf("unexpected args for container %q, expected=%v, got %v", | ||||
| 						c.Name, tt.expectedContainerArgs[c.Name], c.Args) | ||||
| 				if diff := cmp.Diff(tt.expectedContainerArgs[c.Name], c.Args); diff != "" { | ||||
| 					t.Errorf("UpdateContainersEntrypointsIfNeeded() expectedContainerArgs[%s] mismatch (-want +got):\n%s", c.Name, diff) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
|   | ||||
| @@ -1,10 +1,11 @@ | ||||
| package devfile | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"sort" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	"github.com/google/go-cmp/cmp/cmpopts" | ||||
|  | ||||
| 	devfiletesting "github.com/redhat-developer/odo/pkg/devfile/testing" | ||||
|  | ||||
| 	devfilev1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" | ||||
| @@ -161,28 +162,24 @@ func TestGetKubernetesComponentsToPush(t *testing.T) { | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	sorterFuncProvider := func(x []devfilev1.Component) func(i, j int) bool { | ||||
| 		return func(i, j int) bool { | ||||
| 			return x[i].Name < x[j].Name | ||||
| 		} | ||||
| 	lessFunc := func(x, y devfilev1.Component) bool { | ||||
| 		return x.Name < y.Name | ||||
| 	} | ||||
|  | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			got, err := GetKubernetesComponentsToPush(tt.devfileObj, tt.allowApply) | ||||
| 			gotErr := err != nil | ||||
| 			if gotErr != tt.wantErr { | ||||
| 				t.Errorf("Got error %v, expected %v\n", err, tt.wantErr) | ||||
| 			} | ||||
|  | ||||
| 			if len(got) != len(tt.want) { | ||||
| 				t.Errorf("Got %d components, expected %d\n", len(got), len(tt.want)) | ||||
| 			} | ||||
|  | ||||
| 			sort.Slice(tt.want, sorterFuncProvider(tt.want)) | ||||
| 			sort.Slice(got, sorterFuncProvider(got)) | ||||
|  | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("\nGot      %+v\nExpected %+v\n", got, tt.want) | ||||
| 			} | ||||
| 			if gotErr != tt.wantErr { | ||||
| 				t.Errorf("Got error %v, expected %v\n", err, tt.wantErr) | ||||
| 			if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(lessFunc)); diff != "" { | ||||
| 				t.Errorf("GetKubernetesComponentsToPush() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -5,11 +5,11 @@ import ( | ||||
| 	"net/http" | ||||
| 	"net/http/httptest" | ||||
| 	"path/filepath" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
|  | ||||
| 	devfile "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/testingutil/filesystem" | ||||
| ) | ||||
| @@ -138,8 +138,8 @@ func TestGetShellCommand(t *testing.T) { | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			got := getShellCommand(tt.cmdName, tt.image, tt.devfilePath, tt.image.Dockerfile.Uri) | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("%s:\n  Expected %v,\n       got %v", tt.name, tt.want, got) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("getShellCommand() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| package validate | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	devfilev1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| ) | ||||
|  | ||||
| func TestValidateComponents(t *testing.T) { | ||||
| @@ -17,8 +17,8 @@ func TestValidateComponents(t *testing.T) { | ||||
| 		got := validateComponents(components) | ||||
| 		want := &NoComponentsError{} | ||||
|  | ||||
| 		if !reflect.DeepEqual(got, want) { | ||||
| 			t.Errorf("TestValidateComponents error - got: '%v', want: '%v'", got, want) | ||||
| 		if diff := cmp.Diff(want, got); diff != "" { | ||||
| 			t.Errorf("validateComponents() mismatch (-want +got):\n%s", diff) | ||||
| 		} | ||||
| 	}) | ||||
|  | ||||
|   | ||||
| @@ -3,9 +3,9 @@ package exec | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"io" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	corev1 "k8s.io/api/core/v1" | ||||
| 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" | ||||
| ) | ||||
| @@ -87,11 +87,11 @@ func TestExecuteCommand(t *testing.T) { | ||||
| 				t.Errorf("unexpected error %v, wantErr %v", err, tt.wantErr) | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(tt.wantStdout, stdout) { | ||||
| 				t.Errorf("expected %+q for stdout, got %+q", tt.wantStdout, stdout) | ||||
| 			if diff := cmp.Diff(tt.wantStdout, stdout); diff != "" { | ||||
| 				t.Errorf("ExecClient.ExecuteCommand() wantStdout mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(tt.wantStderr, stderr) { | ||||
| 				t.Errorf("expected %+q for stderr, got %+q", tt.wantStderr, stderr) | ||||
| 			if diff := cmp.Diff(tt.wantStderr, stderr); diff != "" { | ||||
| 				t.Errorf("ExecClient.ExecuteCommand() wantStderr mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,8 +1,9 @@ | ||||
| package asker | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| ) | ||||
|  | ||||
| func Test_buildPersonalizedConfigurationOptions(t *testing.T) { | ||||
| @@ -86,11 +87,12 @@ func Test_buildPersonalizedConfigurationOptions(t *testing.T) { | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			gotOptions, gotTracker := buildPersonalizedConfigurationOptions(tt.args.configuration) | ||||
| 			if !reflect.DeepEqual(gotOptions, tt.wantOptions) { | ||||
| 				t.Errorf("buildPersonalizedConfigurationOptions() gotOptions = %v, want %v", gotOptions, tt.wantOptions) | ||||
|  | ||||
| 			if diff := cmp.Diff(tt.wantOptions, gotOptions); diff != "" { | ||||
| 				t.Errorf("buildPersonalizedConfigurationOptions() wantOptions mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(gotTracker, tt.wantTracker) { | ||||
| 				t.Errorf("buildPersonalizedConfigurationOptions() gotTracker = %v, want %v", gotTracker, tt.wantTracker) | ||||
| 			if diff := cmp.Diff(tt.wantTracker, gotTracker); diff != "" { | ||||
| 				t.Errorf("buildPersonalizedConfigurationOptions() wantTracker mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -3,11 +3,12 @@ package backend | ||||
| import ( | ||||
| 	"context" | ||||
| 	"path/filepath" | ||||
| 	"reflect" | ||||
| 	"runtime" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/alizer/go/pkg/apis/recognizer" | ||||
| 	"github.com/redhat-developer/odo/pkg/alizer" | ||||
| 	"github.com/redhat-developer/odo/pkg/api" | ||||
| @@ -102,8 +103,8 @@ func TestAlizerBackend_SelectDevfile(t *testing.T) { | ||||
| 				t.Errorf("AlizerBackend.SelectDevfile() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(gotLocation, tt.wantLocation) { | ||||
| 				t.Errorf("AlizerBackend.SelectDevfile() = %v, want %v", gotLocation, tt.wantLocation) | ||||
| 			if diff := cmp.Diff(tt.wantLocation, gotLocation); diff != "" { | ||||
| 				t.Errorf("AlizerBackend.SelectDevfile() wantLocation mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -2,10 +2,10 @@ package backend | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" | ||||
| 	"github.com/devfile/library/pkg/devfile/parser" | ||||
| @@ -54,8 +54,8 @@ func TestFlagsBackend_SelectDevfile(t *testing.T) { | ||||
| 				t.Errorf("FlagsBackend.SelectDevfile() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("FlagsBackend.SelectDevfile() = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("FlagsBackend.SelectDevfile() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -381,8 +381,8 @@ func TestFlagsBackend_SelectStarterProject(t *testing.T) { | ||||
| 				t.Errorf("FlagsBackend.SelectStarterProject() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got1, tt.want) { | ||||
| 				t.Errorf("FlagsBackend.SelectStarterProject() got1 = %v, want %v", got1, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got1); diff != "" { | ||||
| 				t.Errorf("FlagsBackend.SelectStarterProject() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -2,10 +2,10 @@ package backend | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/alizer" | ||||
| 	"github.com/redhat-developer/odo/pkg/api" | ||||
| @@ -94,11 +94,11 @@ func TestInteractiveBackend_SelectDevfile(t *testing.T) { | ||||
| 			ctx := context.Background() | ||||
| 			got, err := o.SelectDevfile(ctx, map[string]string{}, nil, "") | ||||
| 			if (err != nil) != tt.wantErr { | ||||
| 				t.Errorf("InteractiveBuilder.ParamsBuild() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				t.Errorf("InteractiveBackend.SelectDevfile() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("InteractiveBuilder.ParamsBuild() = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("InteractiveBackend.SelectDevfile() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -194,8 +194,8 @@ func TestInteractiveBackend_SelectStarterProject(t *testing.T) { | ||||
| 				return | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(got1, tt.want) { | ||||
| 				t.Errorf("InteractiveBackend.SelectStarterProject() got1 = %v, want %v", got1, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got1); diff != "" { | ||||
| 				t.Errorf("InteractiveBackend.SelectStarterProject() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -510,7 +510,7 @@ func TestInteractiveBackend_PersonalizeDevfileconfig(t *testing.T) { | ||||
| 					Ports: []string{"7000", "8000"}, | ||||
| 					Envs:  map[string]string{"env1": "val1", "env2": "val2"}, | ||||
| 				} | ||||
| 				return reflect.DeepEqual(config, checkConfig) | ||||
| 				return cmp.Diff(checkConfig, config) == "" | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| @@ -614,8 +614,8 @@ func Test_getPortsAndEnvVar(t *testing.T) { | ||||
| 				t.Errorf("getPortsAndEnvVar() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("getPortsAndEnvVar() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("getPortsAndEnvVar mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,10 +1,12 @@ | ||||
| package kclient | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/go-openapi/jsonpointer" | ||||
| 	"github.com/go-openapi/jsonreference" | ||||
| 	"github.com/go-openapi/spec" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	olm "github.com/operator-framework/api/pkg/operators/v1alpha1" | ||||
| ) | ||||
|  | ||||
| @@ -85,8 +87,8 @@ func TestGetResourceSpecDefinitionFromSwagger(t *testing.T) { | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			got, gotErr := getResourceSpecDefinitionFromSwagger(tt.swagger, tt.group, tt.version, tt.kind) | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("expected %+v\n\ngot %+v", tt.want, got) | ||||
| 			if diff := cmp.Diff(tt.want, got, cmp.AllowUnexported(jsonreference.Ref{}, jsonpointer.Pointer{})); diff != "" { | ||||
| 				t.Errorf("getResourceSpecDefinitionFromSwagger mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 			if (gotErr != nil) != tt.wantErr { | ||||
| 				t.Errorf("Expected error %v, got %v", tt.wantErr, gotErr) | ||||
| @@ -203,8 +205,8 @@ func TestToOpenAPISpec(t *testing.T) { | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			result := toOpenAPISpec(&tt.repr) | ||||
| 			if !reflect.DeepEqual(*result, tt.want) { | ||||
| 				t.Errorf("Failed %s:\n\ngot: %+v\n\nwant: %+v", t.Name(), result, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, *result, cmp.AllowUnexported(jsonreference.Ref{}, jsonpointer.Pointer{})); diff != "" { | ||||
| 				t.Errorf("toOpenAPISpec mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -2,11 +2,11 @@ package kclient | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	"k8s.io/apimachinery/pkg/api/meta" | ||||
| 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" | ||||
| 	"k8s.io/apimachinery/pkg/runtime" | ||||
| @@ -100,8 +100,8 @@ func TestGetOnePodFromSelector(t *testing.T) { | ||||
| 			} else if tt.wantErr && err != nil { | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("GetOnePodFromSelector() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("Client.GetRunningPodFromSelector() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -149,8 +149,8 @@ func TestGetPodUsingComponentName(t *testing.T) { | ||||
| 				t.Errorf("GetPodUsingComponentName() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("GetPodUsingComponentName() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("Client.GetPodUsingComponentName() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -2,16 +2,17 @@ package kclient | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	projectv1 "github.com/openshift/api/project/v1" | ||||
| 	"github.com/redhat-developer/odo/pkg/testingutil" | ||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| 	"k8s.io/apimachinery/pkg/fields" | ||||
| 	"k8s.io/apimachinery/pkg/runtime" | ||||
| 	"k8s.io/apimachinery/pkg/watch" | ||||
| 	ktesting "k8s.io/client-go/testing" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/testingutil" | ||||
| ) | ||||
|  | ||||
| func TestCreateNewProject(t *testing.T) { | ||||
| @@ -90,10 +91,13 @@ func TestCreateNewProject(t *testing.T) { | ||||
|  | ||||
| 				if tt.wait { | ||||
| 					expectedFields := fields.OneTermEqualSelector("metadata.name", tt.projName) | ||||
| 					gotFields := actions[0].(ktesting.WatchAction).GetWatchRestrictions().Fields | ||||
| 					expectedFieldsReq := expectedFields.Requirements() | ||||
|  | ||||
| 					if !reflect.DeepEqual(expectedFields, gotFields) { | ||||
| 						t.Errorf("Fields not matching: expected: %s, got %s", expectedFields, gotFields) | ||||
| 					gotFields := actions[0].(ktesting.WatchAction).GetWatchRestrictions().Fields | ||||
| 					gotFieldsReq := gotFields.Requirements() | ||||
|  | ||||
| 					if diff := cmp.Diff(expectedFieldsReq, gotFieldsReq); diff != "" { | ||||
| 						t.Errorf("OneTermEqualSelector() fieldsReq mismatch (-want +got):\n%s", diff) | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| @@ -136,8 +140,8 @@ func TestListProjects(t *testing.T) { | ||||
| 				return | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("ListProjects() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("Client.ListProjects() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -176,8 +180,8 @@ func TestListProjectNames(t *testing.T) { | ||||
| 				t.Errorf("ListProjectNames() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("ListProjectNames() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("Client.ListProjectNames() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -2,9 +2,9 @@ package kclient | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	"k8s.io/apimachinery/pkg/watch" | ||||
|  | ||||
| 	corev1 "k8s.io/api/core/v1" | ||||
| @@ -221,8 +221,8 @@ func TestListSecrets(t *testing.T) { | ||||
|  | ||||
| 		secretsList, err := client.ListSecrets("") | ||||
|  | ||||
| 		if !reflect.DeepEqual(tt.output, secretsList) { | ||||
| 			t.Errorf("expected output: %#v,got: %#v", tt.secretList, secretsList) | ||||
| 		if diff := cmp.Diff(tt.output, secretsList); diff != "" { | ||||
| 			t.Errorf("Client.ListSecrets() secretsList mismatch (-want +got):\n%s", diff) | ||||
| 		} | ||||
|  | ||||
| 		if err == nil && !tt.wantErr { | ||||
|   | ||||
| @@ -2,10 +2,10 @@ package kclient | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/devfile/library/pkg/devfile/parser/data" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	devfilev1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" | ||||
| 	"github.com/devfile/library/pkg/devfile/generator" | ||||
| @@ -245,8 +245,8 @@ func TestListServices(t *testing.T) { | ||||
| 				t.Errorf("ListServices() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("ListServices() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("Client.ListServices() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -314,8 +314,8 @@ func TestClient_GetOneServiceFromSelector(t *testing.T) { | ||||
| 				t.Errorf("GetOneServiceFromSelector() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("GetOneServiceFromSelector() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("Client.GetOneServiceFromSelector() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| package kclient | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	corev1 "k8s.io/api/core/v1" | ||||
| ) | ||||
|  | ||||
| @@ -92,8 +92,8 @@ func TestGetInputEnvVarsFromStrings(t *testing.T) { | ||||
| 			envVars, err := GetInputEnvVarsFromStrings(tt.envVars) | ||||
|  | ||||
| 			if err == nil && !tt.wantErr { | ||||
| 				if !reflect.DeepEqual(tt.wantedEnvVars, envVars) { | ||||
| 					t.Errorf("corev1.Env values are not matching with expected values, expected: %v, got %v", tt.wantedEnvVars, envVars) | ||||
| 				if diff := cmp.Diff(tt.wantedEnvVars, envVars); diff != "" { | ||||
| 					t.Errorf("GetInputEnvVarsFromStrings() wantedEnvVars mismatch (-want +got):\n%s", diff) | ||||
| 				} | ||||
| 			} else if err == nil && tt.wantErr { | ||||
| 				t.Error("error was expected, but no error was returned") | ||||
|   | ||||
| @@ -3,9 +3,10 @@ package kclient | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/testingutil" | ||||
|  | ||||
| 	corev1 "k8s.io/api/core/v1" | ||||
| @@ -234,8 +235,8 @@ func TestListPVCs(t *testing.T) { | ||||
| 					if PVC.Name != tt.pvcName { | ||||
| 						t.Errorf("TestGetPVCsFromSelector: PVC found with incorrect name, expected: %s actual: %s", tt.pvcName, PVC.Name) | ||||
| 					} | ||||
| 					if !reflect.DeepEqual(PVC.Labels, tt.labels) { | ||||
| 						t.Errorf("TestGetPVCsFromSelector: Labels do not match with expected labels, expected: %s, got %s", tt.labels, PVC.Labels) | ||||
| 					if diff := cmp.Diff(tt.labels, PVC.Labels); diff != "" { | ||||
| 						t.Errorf("Client.ListPVCs() labels mismatch (-want +got):\n%s", diff) | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| @@ -342,8 +343,8 @@ func TestListPVCNames(t *testing.T) { | ||||
| 				t.Errorf("ListPVCNames() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("ListPVCNames() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("Client.ListPVCNames() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| package labels | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	"k8s.io/apimachinery/pkg/labels" | ||||
| 	"k8s.io/apimachinery/pkg/util/validation" | ||||
|  | ||||
| @@ -70,8 +70,9 @@ func Test_getLabels(t *testing.T) { | ||||
| 	} | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			if got := getLabels(tt.args.componentName, tt.args.applicationName, ComponentDevMode, tt.args.additional, tt.args.isPartOfComponent); !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("GetLabels() = %v, want %v", got, tt.want) | ||||
| 			got := getLabels(tt.args.componentName, tt.args.applicationName, ComponentDevMode, tt.args.additional, tt.args.isPartOfComponent) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("getLabels() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -3,7 +3,6 @@ package libdevfile | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" | ||||
| @@ -13,6 +12,7 @@ import ( | ||||
| 	devfileFileSystem "github.com/devfile/library/pkg/testingutil/filesystem" | ||||
| 	dfutil "github.com/devfile/library/pkg/util" | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	"k8s.io/utils/pointer" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/libdevfile/generator" | ||||
| @@ -696,8 +696,8 @@ func TestGetContainerEndpointMapping(t *testing.T) { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			got := GetContainerEndpointMapping(tt.args.containers) | ||||
|  | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("GetContainerEndpointMapping() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("GetContainerEndpointMapping() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -800,8 +800,8 @@ func TestGetEndpointsFromDevfile(t *testing.T) { | ||||
| 				t.Errorf("GetEndpointsFromDevfile() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("GetEndpointsFromDevfile() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("GetEndpointsFromDevfile() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -1779,8 +1779,8 @@ func TestGetContainerComponentsForCommand(t *testing.T) { | ||||
| 			if tt.wantErr != (err != nil) { | ||||
| 				t.Errorf("unexpected error, wantErr: %v, err: %v", tt.wantErr, err) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(tt.want, got) { | ||||
| 				t.Errorf("want: %v, got %v", tt.want, got) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("GetContainerComponentsForCommand() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| package libdevfile | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" | ||||
| @@ -12,6 +11,7 @@ import ( | ||||
| 	context "github.com/devfile/library/pkg/devfile/parser/context" | ||||
| 	"github.com/devfile/library/pkg/devfile/parser/data" | ||||
| 	"github.com/devfile/library/pkg/testingutil/filesystem" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/libdevfile/generator" | ||||
|  | ||||
| @@ -357,8 +357,8 @@ func TestGetReferencedLocalFiles(t *testing.T) { | ||||
| 				t.Errorf("GetReferencedLocalFiles() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(gotResult, tt.wantResult) { | ||||
| 				t.Errorf("GetReferencedLocalFiles() = %v, want %v", gotResult, tt.wantResult) | ||||
| 			if diff := cmp.Diff(tt.wantResult, gotResult); diff != "" { | ||||
| 				t.Errorf("GetReferencedLocalFiles() wantResult mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -412,8 +412,8 @@ func Test_appendUriIfFile(t *testing.T) { | ||||
| 				t.Errorf("appendUriIfFile() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("appendUriIfFile() = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("appendUriIfFile() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -519,8 +519,8 @@ func Test_getFromAttributes(t *testing.T) { | ||||
| 				t.Errorf("getFromAttributes() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("getFromAttributes() = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("getFromAttributes() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -6,12 +6,12 @@ import ( | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/devfile/library/pkg/devfile/parser" | ||||
| 	"github.com/devfile/library/pkg/testingutil/filesystem" | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	corev1 "k8s.io/api/core/v1" | ||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" | ||||
| @@ -304,8 +304,9 @@ func Test_listResourcesMissingFromDevfilePresentOnCluster(t *testing.T) { | ||||
| 	} | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			if got := listResourcesMissingFromDevfilePresentOnCluster(tt.args.componentName, tt.args.devfileResources, tt.args.clusterResources); !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("listResourcesMissingFromDevfilePresentOnCluster() = %v, want %v", got, tt.want) | ||||
| 			got := listResourcesMissingFromDevfilePresentOnCluster(tt.args.componentName, tt.args.devfileResources, tt.args.clusterResources) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("listResourcesMissingFromDevfilePresentOnCluster() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -6,10 +6,11 @@ import ( | ||||
| 	"io/fs" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/testingutil/filesystem" | ||||
| 	"github.com/redhat-developer/odo/pkg/util" | ||||
| ) | ||||
| @@ -151,8 +152,8 @@ func TestGetFilesGeneratedByOdo(t *testing.T) { | ||||
| 				t.Errorf("error = %v, wantErr %v", err, tt.wantErr) | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(tt.want, got) { | ||||
| 				t.Errorf("expected %+q for stdout, got %+q", tt.want, got) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("GetFilesGeneratedByOdo() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,9 +1,10 @@ | ||||
| package portForward | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/api" | ||||
| ) | ||||
|  | ||||
| @@ -55,8 +56,8 @@ func Test_getForwardedPort(t *testing.T) { | ||||
| 				t.Errorf("getForwardedPort() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("getForwardedPort() = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("getForwardedPort() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -5,11 +5,12 @@ import ( | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"reflect" | ||||
| 	"strconv" | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/config" | ||||
| 	envcontext "github.com/redhat-developer/odo/pkg/config/context" | ||||
|  | ||||
| @@ -71,9 +72,8 @@ func TestNew(t *testing.T) { | ||||
| 					t.Errorf("expected test to fail, but it passed!") | ||||
| 				} | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(test.output, cfi) { | ||||
| 				t.Errorf("expected output: %#v", test.output) | ||||
| 				t.Errorf("actual output: %#v", cfi) | ||||
| 			if diff := cmp.Diff(test.output, cfi); diff != "" { | ||||
| 				t.Errorf("newPreferenceInfo() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -614,8 +614,8 @@ func TestHandleWithoutRegistryExist(t *testing.T) { | ||||
| 				t.Logf("Error message is %v", err) | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("Got: %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("handleWithoutRegistryExist() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -667,8 +667,8 @@ func TestHandleWithRegistryExist(t *testing.T) { | ||||
| 			t.Logf("Error message is %v", err) | ||||
| 		} | ||||
|  | ||||
| 		if !reflect.DeepEqual(got, tt.want) { | ||||
| 			t.Errorf("Got: %v, want: %v", got, tt.want) | ||||
| 		if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 			t.Errorf("handleWithRegistryExist() mismatch (-want +got):\n%s", diff) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -1,12 +1,13 @@ | ||||
| package project | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/redhat-developer/odo/pkg/kclient" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/kclient" | ||||
| ) | ||||
|  | ||||
| func TestCreate(t *testing.T) { | ||||
| @@ -236,8 +237,8 @@ func TestList(t *testing.T) { | ||||
| 				return | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(list, tt.expectedList) { | ||||
| 				t.Errorf("Expected value:\n%+v\ngot:\n%+v", tt.expectedList, list) | ||||
| 			if diff := cmp.Diff(tt.expectedList, list); diff != "" { | ||||
| 				t.Errorf("Client.List() expectedList mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,9 +1,10 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/api" | ||||
| ) | ||||
|  | ||||
| @@ -66,8 +67,9 @@ func TestDevfileStackList_GetLanguages(t *testing.T) { | ||||
| 			o := &DevfileStackList{ | ||||
| 				Items: tt.fields.Items, | ||||
| 			} | ||||
| 			if got := o.GetLanguages(); !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("DevfileStackList.GetLanguages() = %v, want %v", got, tt.want) | ||||
| 			got := o.GetLanguages() | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("DevfileStackList.GetLanguages() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -176,8 +178,9 @@ func TestDevfileStackList_GetProjectTypes(t *testing.T) { | ||||
| 			o := &DevfileStackList{ | ||||
| 				Items: tt.fields.Items, | ||||
| 			} | ||||
| 			if got := o.GetProjectTypes(tt.args.language); !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("DevfileStackList.GetProjectTypes() = \n%+v, want \n%+v", got, tt.want) | ||||
| 			got := o.GetProjectTypes(tt.args.language) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("DevfileStackList.GetProjectTypes() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -6,11 +6,11 @@ import ( | ||||
| 	"net/http" | ||||
| 	"net/http/httptest" | ||||
| 	"os" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/kylelemons/godebug/pretty" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	"github.com/google/go-cmp/cmp/cmpopts" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/api" | ||||
| 	"github.com/redhat-developer/odo/pkg/config" | ||||
| @@ -88,8 +88,8 @@ OdoSettings: | ||||
| 				t.Errorf("Error message is %v", err) | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("Got: %v, want: %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("RegistryClient.GetDevfileRegistries() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -246,13 +246,7 @@ func TestListDevfileStacks(t *testing.T) { | ||||
| 		{ | ||||
| 			name:         "Case 4: Expect nothing back if registry is not found", | ||||
| 			registryName: "Foobar", | ||||
| 			want: DevfileStackList{ | ||||
| 				// We use "nil" here as reflect.DeepEqual() returns false if one slice is nil, | ||||
| 				// and the other is a non-nil slice with 0 length. | ||||
| 				// So we simply just say 'nil' | ||||
| 				DevfileRegistries: nil, | ||||
| 				Items:             nil, | ||||
| 			}, | ||||
| 			want:         DevfileStackList{}, | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| @@ -274,10 +268,8 @@ func TestListDevfileStacks(t *testing.T) { | ||||
| 				t.Error(err) | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("Got: %+v \n\n Want: %+v", got, tt.want) | ||||
| 				t.Errorf("Comparison: %v", pretty.Compare(got, tt.want)) | ||||
| 				t.Logf("Error message is: %v", err) | ||||
| 			if diff := cmp.Diff(tt.want, got, cmpopts.EquateEmpty()); diff != "" { | ||||
| 				t.Errorf("RegistryClient.ListDevfileStacks() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -349,8 +341,8 @@ func TestGetRegistryDevfiles(t *testing.T) { | ||||
| 			ctx = envcontext.WithEnvConfig(ctx, config.Configuration{}) | ||||
| 			got, err := getRegistryStacks(ctx, prefClient, tt.registry) | ||||
|  | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("Got: %v, want: %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("getRegistryStacks() mismatch (-want +got):\n%s", diff) | ||||
| 				t.Logf("Error message is: %v", err) | ||||
| 			} | ||||
| 		}) | ||||
|   | ||||
| @@ -1,9 +1,10 @@ | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/api" | ||||
| ) | ||||
|  | ||||
| @@ -48,8 +49,9 @@ func TestTypesWithDetails_GetOrderedLabels(t *testing.T) { | ||||
| 	} | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			if got := tt.types.GetOrderedLabels(); !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("TypesWithDetails.GetOrderedLabels() = %v, want %v", got, tt.want) | ||||
| 			got := tt.types.GetOrderedLabels() | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("GetOrderedLabels() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -216,8 +218,8 @@ func TestTypesWithDetails_GetAtOrderedPosition(t *testing.T) { | ||||
| 				t.Errorf("TypesWithDetails.GetAtOrderedPosition() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("TypesWithDetails.GetAtOrderedPosition() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("GetAtOrderedPosition() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -3,9 +3,10 @@ package registry | ||||
| import ( | ||||
| 	"context" | ||||
| 	"io/ioutil" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/config" | ||||
| 	envcontext "github.com/redhat-developer/odo/pkg/config/context" | ||||
| 	"github.com/redhat-developer/odo/pkg/preference" | ||||
| @@ -64,8 +65,8 @@ func TestIsSecure(t *testing.T) { | ||||
| 			} | ||||
|  | ||||
| 			got := IsSecure(cfg, tt.registryName) | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("Got: %t, want %t", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("IsSecure() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -4,12 +4,12 @@ import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"reflect" | ||||
| 	"sync" | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/exec" | ||||
| 	"github.com/redhat-developer/odo/pkg/kclient" | ||||
| @@ -156,8 +156,8 @@ func TestKubeExecProcessHandler_GetProcessInfoForCommand(t *testing.T) { | ||||
| 			if tt.wantErr != (err != nil) { | ||||
| 				t.Errorf("unexpected error %v, wantErr %v", err, tt.wantErr) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(tt.want, got) { | ||||
| 				t.Errorf("expected %v, got %v", tt.want, got) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("kubeExecProcessHandler.GetProcessInfoForCommand() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -281,8 +281,8 @@ func TestKubeExecProcessHandler_StartProcessForCommand(t *testing.T) { | ||||
| 				return | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(tt.expectedStatuses, statusesReported) { | ||||
| 				t.Errorf("expected %v, got %v", tt.expectedStatuses, statusesReported) | ||||
| 			if diff := cmp.Diff(tt.expectedStatuses, statusesReported); diff != "" { | ||||
| 				t.Errorf("kubeExecProcessHandler.StartProcessForCommand() expectedStatuses mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -566,8 +566,8 @@ func Test_getProcessInfoFromPid(t *testing.T) { | ||||
| 			if tt.wantErr != (err != nil) { | ||||
| 				t.Errorf("unexpected error %v, wantErr %v", err, tt.wantErr) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(tt.want, got) { | ||||
| 				t.Errorf("expected %v, got %v", tt.want, got) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("kubeExecProcessHandler.getProcessInfoFromPid() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -716,11 +716,11 @@ func Test_getRemoteProcessPID(t *testing.T) { | ||||
| 			if tt.wantErr != (err != nil) { | ||||
| 				t.Errorf("unexpected error %v, wantErr %v", err, tt.wantErr) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(tt.wantPid, got) { | ||||
| 				t.Errorf("expected PID %v, got %v", tt.wantPid, got) | ||||
| 			if diff := cmp.Diff(tt.wantPid, got); diff != "" { | ||||
| 				t.Errorf("kubeExecProcessHandler.getRemoteProcessPID() wantPid mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(tt.wantLastKnownExitCode, lastKnownExitStatus) { | ||||
| 				t.Errorf("expected recorded exit code %v, got %v", tt.wantLastKnownExitCode, lastKnownExitStatus) | ||||
| 			if diff := cmp.Diff(tt.wantLastKnownExitCode, lastKnownExitStatus); diff != "" { | ||||
| 				t.Errorf("kubeExecProcessHandler.getRemoteProcessPID() wantLastKnownExitCode mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -944,10 +944,9 @@ func Test_getProcessChildren(t *testing.T) { | ||||
| 			if tt.wantErr != (err != nil) { | ||||
| 				t.Errorf("unexpected error %v, wantErr %v", err, tt.wantErr) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(tt.want, got) { | ||||
| 				t.Errorf("expected %v, got %v", tt.want, got) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("kubeExecProcessHandler.getProcessChildren() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
|  | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -3,10 +3,10 @@ package context | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	"github.com/spf13/pflag" | ||||
| ) | ||||
|  | ||||
| @@ -18,8 +18,8 @@ func TestGetContextProperties(t *testing.T) { | ||||
| 	got := GetContextProperties(ctx) | ||||
| 	want := map[string]interface{}{ckey: value} | ||||
|  | ||||
| 	if !reflect.DeepEqual(got, want) { | ||||
| 		t.Errorf("want: %q got: %q", want, got) | ||||
| 	if diff := cmp.Diff(want, got); diff != "" { | ||||
| 		t.Errorf("GetContextProperties() mismatch (-want +got):\n%s", diff) | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -2,10 +2,10 @@ package service | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/go-openapi/spec" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| ) | ||||
|  | ||||
| func TestBuildCRDFromParams(t *testing.T) { | ||||
| @@ -174,7 +174,8 @@ func TestBuildCRDFromParams(t *testing.T) { | ||||
| 				t.Errorf("got err: %v, expected err: %v\n", gotErr != nil, tt.wantErr) | ||||
| 			} | ||||
| 			if gotErr == nil { | ||||
| 				if !reflect.DeepEqual(got["spec"], tt.want) { | ||||
| 				if diff := cmp.Diff(tt.want, got["spec"]); diff != "" { | ||||
| 					t.Errorf("BuildCRDFromParams() mismatch (-want +got):\n%s", diff) | ||||
| 					jsonGot, _ := json.Marshal(got["spec"]) | ||||
| 					jsonWant, _ := json.Marshal(tt.want) | ||||
| 					t.Errorf("\ngot:  %+v\n\nwant: %v\n", string(jsonGot), string(jsonWant)) | ||||
|   | ||||
| @@ -3,9 +3,10 @@ package service | ||||
| import ( | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/devfile/consts" | ||||
| 	devfiletesting "github.com/redhat-developer/odo/pkg/devfile/testing" | ||||
|  | ||||
| @@ -115,8 +116,8 @@ spec: | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			got, gotErr := listDevfileLinks(tt.devfileObj, testFolderName, fs) | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("%s: got %v, expect %v", t.Name(), got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("listDevfileLinks() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 			if gotErr != tt.wantErr { | ||||
| 				t.Errorf("%s: got %v, expect %v", t.Name(), gotErr, tt.wantErr) | ||||
|   | ||||
| @@ -3,9 +3,10 @@ package state | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/api" | ||||
| 	"github.com/redhat-developer/odo/pkg/testingutil/filesystem" | ||||
| ) | ||||
| @@ -63,8 +64,8 @@ func TestState_SetForwardedPorts(t *testing.T) { | ||||
| 					return err | ||||
| 				} | ||||
| 				expected := []api.ForwardedPort{forwardedPort1} | ||||
| 				if !reflect.DeepEqual(content.ForwardedPorts, expected) { | ||||
| 					return fmt.Errorf("Forwarded ports is %+v, should be %+v", content.ForwardedPorts, expected) | ||||
| 				if diff := cmp.Diff(expected, content.ForwardedPorts); diff != "" { | ||||
| 					return fmt.Errorf("forwarded ports is %+v, should be %+v, diff: %s", content.ForwardedPorts, expected, diff) | ||||
| 				} | ||||
| 				return nil | ||||
| 			}, | ||||
| @@ -198,8 +199,8 @@ func TestState_GetForwardedPorts(t *testing.T) { | ||||
| 				t.Errorf("State.GetForwardedPorts() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("State.GetForwardedPorts() = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("State.GetForwardedPorts() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| package storage | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	appsv1 "k8s.io/api/apps/v1" | ||||
| 	corev1 "k8s.io/api/core/v1" | ||||
| 	"k8s.io/apimachinery/pkg/api/resource" | ||||
| @@ -337,8 +337,8 @@ func Test_kubernetesClient_List(t *testing.T) { | ||||
| 				t.Errorf("List() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("List() got = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("kubernetesClient.List() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -427,20 +427,20 @@ func Test_kubernetesClient_Create(t *testing.T) { | ||||
| 			odolabels.AddStorageInfo(wantLabels, tt.args.storage.Name, strings.Contains(tt.args.storage.Name, OdoSourceVolume)) | ||||
|  | ||||
| 			// created PVC should be labeled with labels passed to CreatePVC | ||||
| 			if !reflect.DeepEqual(createdPVC.Labels, wantLabels) { | ||||
| 				t.Errorf("labels in created pvc is not matching expected labels, expected: %v, got: %v", wantLabels, createdPVC.Labels) | ||||
| 			if diff := cmp.Diff(wantLabels, createdPVC.Labels); diff != "" { | ||||
| 				t.Errorf("kubernetesClient.Create() wantLabels mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 			// name, size of createdPVC should be matching to size, name passed to CreatePVC | ||||
| 			if !reflect.DeepEqual(createdPVC.Spec.Resources.Requests["storage"], quantity) { | ||||
| 				t.Errorf("size of PVC is not matching to expected size, expected: %v, got %v", quantity, createdPVC.Spec.Resources.Requests["storage"]) | ||||
| 			if diff := cmp.Diff(quantity, createdPVC.Spec.Resources.Requests["storage"]); diff != "" { | ||||
| 				t.Errorf("kubernetesClient.Create() quantity mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
|  | ||||
| 			wantedPVCName, err := generatePVCName(tt.args.storage.Name, tt.fields.generic.componentName, tt.fields.generic.appName) | ||||
| 			if err != nil { | ||||
| 				t.Errorf("unexpected error: %v", err) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(createdPVC.Name, wantedPVCName) { | ||||
| 				t.Errorf("name of the PVC is not matching to expected name, expected: %v, got %v", wantedPVCName, createdPVC.Name) | ||||
| 			if diff := cmp.Diff(wantedPVCName, createdPVC.Name); diff != "" { | ||||
| 				t.Errorf("kubernetesClient.Create() wantedPVCName mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,12 +1,13 @@ | ||||
| package storage | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	devfilev1 "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" | ||||
| 	"github.com/devfile/library/pkg/devfile/parser" | ||||
| 	"github.com/devfile/library/pkg/devfile/parser/data" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/testingutil" | ||||
| ) | ||||
|  | ||||
| @@ -228,8 +229,8 @@ func TestEnvInfo_ListStorage(t *testing.T) { | ||||
| 			if (err != nil) != tt.wantErr { | ||||
| 				t.Errorf("ListStorage() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("ListStorage() = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("ListStorage() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -253,8 +253,8 @@ func TestPush(t *testing.T) { | ||||
| 			for k := range ephemerals { | ||||
| 				ephemeralKeys = append(ephemeralKeys, k) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(tt.wantEphemeralNames, ephemeralKeys) { | ||||
| 				t.Errorf("Expected ephemeral names are %v, got %v\n", tt.wantEphemeralNames, ephemeralKeys) | ||||
| 			if diff := cmp.Diff(tt.wantEphemeralNames, ephemeralKeys); diff != "" { | ||||
| 				t.Errorf("Push() ephemeral names mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| package storage | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| ) | ||||
|  | ||||
| @@ -51,8 +51,8 @@ func TestNewStorage(t *testing.T) { | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			gotStorage := NewStorage(tt.storageName, tt.storageSize, tt.mountedPath, nil) | ||||
| 			if !reflect.DeepEqual(tt.want, gotStorage) { | ||||
| 				t.Errorf("the returned storage is different, expected: %v, got: %v", tt.want, gotStorage) | ||||
| 			if diff := cmp.Diff(tt.want, gotStorage); diff != "" { | ||||
| 				t.Errorf("NewStorage() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -175,8 +175,8 @@ func TestNewStorageList(t *testing.T) { | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			gotStorage := NewStorageList(tt.inputStorage) | ||||
| 			if !reflect.DeepEqual(tt.want, gotStorage) { | ||||
| 				t.Errorf("the returned storage is different, expected: %v, got: %v", tt.want, gotStorage) | ||||
| 			if diff := cmp.Diff(tt.want, gotStorage); diff != "" { | ||||
| 				t.Errorf("NewStorageList() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -7,11 +7,11 @@ import ( | ||||
| 	"os" | ||||
| 	"path" | ||||
| 	"path/filepath" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/devfile/library/pkg/devfile/generator" | ||||
| 	"github.com/golang/mock/gomock" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/exec" | ||||
| 	"github.com/redhat-developer/odo/pkg/kclient" | ||||
| @@ -38,8 +38,8 @@ func TestGetCmdToCreateSyncFolder(t *testing.T) { | ||||
| 	} | ||||
| 	for _, tt := range tests { | ||||
| 		cmdArr := getCmdToCreateSyncFolder(tt.syncFolder) | ||||
| 		if !reflect.DeepEqual(tt.want, cmdArr) { | ||||
| 			t.Errorf("Expected %s, got %s", tt.want, cmdArr) | ||||
| 		if diff := cmp.Diff(tt.want, cmdArr); diff != "" { | ||||
| 			t.Errorf("getCmdToCreateSyncFolder() mismatch (-want +got):\n%s", diff) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -74,8 +74,8 @@ func TestGetCmdToDeleteFiles(t *testing.T) { | ||||
| 	} | ||||
| 	for _, tt := range tests { | ||||
| 		cmdArr := getCmdToDeleteFiles(tt.delFiles, tt.syncFolder) | ||||
| 		if !reflect.DeepEqual(tt.want, cmdArr) { | ||||
| 			t.Errorf("Expected %s, got %s", tt.want, cmdArr) | ||||
| 		if diff := cmp.Diff(tt.want, cmdArr); diff != "" { | ||||
| 			t.Errorf("getCmdToDeleteFiles() mismatch (-want +got):\n%s", diff) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -4,12 +4,11 @@ import ( | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"reflect" | ||||
| 	"sort" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/kylelemons/godebug/pretty" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	"github.com/google/go-cmp/cmp/cmpopts" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/testingutil/filesystem" | ||||
| ) | ||||
| @@ -1097,23 +1096,23 @@ func Test_recursiveChecker(t *testing.T) { | ||||
| 				return | ||||
| 			} | ||||
|  | ||||
| 			sort.Strings(got.FilesDeleted) | ||||
| 			sort.Strings(got.FilesChanged) | ||||
| 			sort.Strings(got.RemoteDeleted) | ||||
| 			if !reflect.DeepEqual(got.FilesChanged, tt.want.FilesChanged) { | ||||
| 				t.Errorf("recursiveChecker() FilesChanged got = %v, want %v", got.FilesChanged, tt.want.FilesChanged) | ||||
| 			sortOpt := cmpopts.SortSlices(func(x, y string) bool { | ||||
| 				return x < y | ||||
| 			}) | ||||
| 			if diff := cmp.Diff(tt.want.FilesChanged, got.FilesChanged, sortOpt); diff != "" { | ||||
| 				t.Errorf("recursiveChecker() FilesChanged mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(got.FilesDeleted, tt.want.FilesDeleted) { | ||||
| 				t.Errorf("recursiveChecker() FilesDeleted got = %v, want %v", got.FilesDeleted, tt.want.FilesDeleted) | ||||
| 			if diff := cmp.Diff(tt.want.FilesDeleted, got.FilesDeleted, sortOpt); diff != "" { | ||||
| 				t.Errorf("recursiveChecker() FilesDeleted mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(got.RemoteDeleted, tt.want.RemoteDeleted) { | ||||
| 				t.Errorf("recursiveChecker() RemoteDeleted got = %v, want %v", got.RemoteDeleted, tt.want.RemoteDeleted) | ||||
| 			if diff := cmp.Diff(tt.want.RemoteDeleted, got.RemoteDeleted, sortOpt); diff != "" { | ||||
| 				t.Errorf("recursiveChecker() RemoteDeleted mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(tt.want.NewFileMap, got.NewFileMap) { | ||||
| 				t.Errorf("recursiveChecker() new file map is different, difference = %v", pretty.Compare(got.NewFileMap, tt.want.NewFileMap)) | ||||
| 			if diff := cmp.Diff(tt.want.NewFileMap, got.NewFileMap); diff != "" { | ||||
| 				t.Errorf("recursiveChecker() NewFileMap mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -1604,23 +1603,22 @@ func Test_runIndexerWithExistingFileIndex(t *testing.T) { | ||||
| 				return | ||||
| 			} | ||||
|  | ||||
| 			sort.Strings(gotRet.FilesDeleted) | ||||
| 			sort.Strings(gotRet.FilesChanged) | ||||
| 			sort.Strings(gotRet.RemoteDeleted) | ||||
| 			if !reflect.DeepEqual(gotRet.FilesChanged, tt.wantRet.FilesChanged) { | ||||
| 				t.Errorf("runIndexerWithExistingFileIndex() fileChanged gotRet = %v, want %v", gotRet.FilesChanged, tt.wantRet.FilesChanged) | ||||
| 			sortOpt := cmpopts.SortSlices(func(x, y string) bool { | ||||
| 				return x < y | ||||
| 			}) | ||||
|  | ||||
| 			if diff := cmp.Diff(tt.wantRet.FilesChanged, gotRet.FilesChanged, sortOpt); diff != "" { | ||||
| 				t.Errorf("runIndexerWithExistingFileIndex() FilesChanged mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 			if diff := cmp.Diff(tt.wantRet.NewFileMap, gotRet.NewFileMap); diff != "" { | ||||
| 				t.Errorf("runIndexerWithExistingFileIndex() NewFileMap mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(gotRet.NewFileMap, tt.wantRet.NewFileMap) { | ||||
| 				t.Errorf("runIndexerWithExistingFileIndex() new file map is different = %v", pretty.Compare(gotRet.NewFileMap, tt.wantRet.NewFileMap)) | ||||
| 			if diff := cmp.Diff(tt.wantRet.FilesDeleted, gotRet.FilesDeleted, sortOpt); diff != "" { | ||||
| 				t.Errorf("runIndexerWithExistingFileIndex() FilesDeleted mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(gotRet.FilesDeleted, tt.wantRet.FilesDeleted) { | ||||
| 				t.Errorf("runIndexerWithExistingFileIndex() files deleted gotRet = %v, want %v", gotRet.FilesDeleted, tt.wantRet.FilesDeleted) | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(gotRet.RemoteDeleted, tt.wantRet.RemoteDeleted) { | ||||
| 				t.Errorf("runIndexerWithExistingFileIndex() files remote changed gotRet = %v, want %v", gotRet.RemoteDeleted, tt.wantRet.RemoteDeleted) | ||||
| 			if diff := cmp.Diff(tt.wantRet.RemoteDeleted, gotRet.RemoteDeleted, sortOpt); diff != "" { | ||||
| 				t.Errorf("runIndexerWithExistingFileIndex() RemoteDeleted mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -12,7 +12,6 @@ import ( | ||||
| 	"os" | ||||
| 	"os/user" | ||||
| 	"path/filepath" | ||||
| 	"reflect" | ||||
| 	"regexp" | ||||
| 	"runtime" | ||||
| 	"strconv" | ||||
| @@ -21,6 +20,7 @@ import ( | ||||
|  | ||||
| 	"github.com/go-git/go-git/v5" | ||||
| 	"github.com/go-git/go-git/v5/config" | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" | ||||
| 	dfutil "github.com/devfile/library/pkg/util" | ||||
| @@ -625,8 +625,8 @@ func TestGetIgnoreRulesFromDirectory(t *testing.T) { | ||||
| 		gotRules, err := dfutil.GetIgnoreRulesFromDirectory(testDir) | ||||
|  | ||||
| 		if err == nil && !tt.wantErr { | ||||
| 			if !reflect.DeepEqual(gotRules, tt.wantRules) { | ||||
| 				t.Errorf("the expected value of rules are different, excepted: %v, got: %v", tt.wantRules, gotRules) | ||||
| 			if diff := cmp.Diff(tt.wantRules, gotRules); diff != "" { | ||||
| 				t.Errorf("dfutil.GetIgnoreRulesFromDirectory() wantRules mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		} else if err == nil && tt.wantErr { | ||||
| 			t.Error("error was expected, but no error was returned") | ||||
| @@ -678,8 +678,8 @@ func TestGetAbsGlobExps(t *testing.T) { | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(resultExps, tt.expectedGlobExps) { | ||||
| 				t.Errorf("expected %v, got %v", tt.expectedGlobExps, resultExps) | ||||
| 			if diff := cmp.Diff(tt.expectedGlobExps, resultExps); diff != "" { | ||||
| 				t.Errorf("dfutil.GetAbsGlobExps() expectedGlobExps mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -702,8 +702,8 @@ func TestGetSortedKeys(t *testing.T) { | ||||
| 		t.Log("Running test: ", tt.testName) | ||||
| 		t.Run(tt.testName, func(t *testing.T) { | ||||
| 			actual := dfutil.GetSortedKeys(tt.input) | ||||
| 			if !reflect.DeepEqual(tt.expected, actual) { | ||||
| 				t.Errorf("expected: %+v, got: %+v", tt.expected, actual) | ||||
| 			if diff := cmp.Diff(tt.expected, actual); diff != "" { | ||||
| 				t.Errorf("dfutil.GetSortedKeys() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -736,8 +736,8 @@ func TestGetSplitValuesFromStr(t *testing.T) { | ||||
| 		t.Log("Running test: ", tt.testName) | ||||
| 		t.Run(tt.testName, func(t *testing.T) { | ||||
| 			actual := dfutil.GetSplitValuesFromStr(tt.input) | ||||
| 			if !reflect.DeepEqual(tt.expected, actual) { | ||||
| 				t.Errorf("expected: %+v, got: %+v", tt.expected, actual) | ||||
| 			if diff := cmp.Diff(tt.expected, actual); diff != "" { | ||||
| 				t.Errorf("dfutil.GetSplitValuesFromStr() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -821,8 +821,8 @@ func TestGetContainerPortsFromStrings(t *testing.T) { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			ports, err := dfutil.GetContainerPortsFromStrings(tt.ports) | ||||
| 			if err == nil && !tt.wantErr { | ||||
| 				if !reflect.DeepEqual(tt.containerPorts, ports) { | ||||
| 					t.Errorf("the ports are not matching, expected %#v, got %#v", tt.containerPorts, ports) | ||||
| 				if diff := cmp.Diff(tt.containerPorts, ports); diff != "" { | ||||
| 					t.Errorf("dfutil.GetContainerPortsFromStrings() containerPorts mismatch (-want +got):\n%s", diff) | ||||
| 				} | ||||
| 			} else if err == nil && tt.wantErr { | ||||
| 				t.Error("error was expected, but no error was returned") | ||||
| @@ -956,8 +956,8 @@ func TestRemoveRelativePathFromFiles(t *testing.T) { | ||||
| 				return | ||||
| 			} | ||||
|  | ||||
| 			if !(reflect.DeepEqual(output, tt.args.output)) { | ||||
| 				t.Errorf("expected %v, got %v", tt.args.output, output) | ||||
| 			if diff := cmp.Diff(tt.args.output, output); diff != "" { | ||||
| 				t.Errorf("dfutil.RemoveRelativePathFromFiles() output mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
|  | ||||
| 		}) | ||||
| @@ -1027,8 +1027,8 @@ func TestGetRemoteFilesMarkedForDeletion(t *testing.T) { | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			remoteFiles := dfutil.GetRemoteFilesMarkedForDeletion(tt.files, tt.remotePath) | ||||
| 			if !reflect.DeepEqual(tt.want, remoteFiles) { | ||||
| 				t.Errorf("Expected %s, got %s", tt.want, remoteFiles) | ||||
| 			if diff := cmp.Diff(tt.want, remoteFiles); diff != "" { | ||||
| 				t.Errorf("dfutil.GetRemoteFilesMarkedForDeletion() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -1072,8 +1072,8 @@ func TestHTTPGetRequest(t *testing.T) { | ||||
| 			} | ||||
| 			got, err := dfutil.HTTPGetRequest(request, 0) | ||||
|  | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("Got: %v, want: %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("dfutil.HTTPGetRequest() mismatch (-want +got):\n%s", diff) | ||||
| 				t.Logf("Error message is: %v", err) | ||||
| 			} | ||||
| 		}) | ||||
| @@ -1127,12 +1127,12 @@ func TestFilterIgnores(t *testing.T) { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			filterChanged, filterDeleted := dfutil.FilterIgnores(tt.changedFiles, tt.deletedFiles, tt.ignoredFiles) | ||||
|  | ||||
| 			if !reflect.DeepEqual(tt.wantChangedFiles, filterChanged) { | ||||
| 				t.Errorf("Expected %s, got %s", tt.wantChangedFiles, filterChanged) | ||||
| 			if diff := cmp.Diff(tt.wantChangedFiles, filterChanged); diff != "" { | ||||
| 				t.Errorf("dfutil.FilterIgnores() wantChangedFiles mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(tt.wantDeletedFiles, filterDeleted) { | ||||
| 				t.Errorf("Expected %s, got %s", tt.wantDeletedFiles, filterDeleted) | ||||
| 			if diff := cmp.Diff(tt.wantDeletedFiles, filterDeleted); diff != "" { | ||||
| 				t.Errorf("dfutil.FilterIgnores() wantDeletedFiles mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -1195,8 +1195,8 @@ func TestDownloadFile(t *testing.T) { | ||||
| 			if err != nil { | ||||
| 				gotErr = true | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(gotErr, tt.wantErr) { | ||||
| 				t.Error("Failed to get expected error") | ||||
| 			if gotErr != tt.wantErr { | ||||
| 				t.Errorf("Failed to get expected error: %v", err) | ||||
| 			} | ||||
|  | ||||
| 			if !tt.wantErr { | ||||
| @@ -1209,8 +1209,8 @@ func TestDownloadFile(t *testing.T) { | ||||
| 					t.Errorf("Failed to read file with error %s", err) | ||||
| 				} | ||||
|  | ||||
| 				if !reflect.DeepEqual(got, tt.want) { | ||||
| 					t.Errorf("Got: %v, want: %v", got, tt.want) | ||||
| 				if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 					t.Errorf("dfutil.DownloadFile() mismatch (-want +got):\n%s", diff) | ||||
| 				} | ||||
|  | ||||
| 				// Clean up the file that downloaded in this test case | ||||
| @@ -1254,8 +1254,8 @@ func TestValidateK8sResourceName(t *testing.T) { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			err := dfutil.ValidateK8sResourceName(tt.key, tt.value) | ||||
| 			got := err == nil | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("Got %t, want %t", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("dfutil.ValidateK8sResourceName() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -1426,8 +1426,10 @@ func TestIsValidProjectDir(t *testing.T) { | ||||
| 				expectedError = fmt.Sprintf(expectedError, tmpDir) | ||||
| 			} | ||||
|  | ||||
| 			if err != nil && !reflect.DeepEqual(err.Error(), expectedError) { | ||||
| 				t.Errorf("Got err: %s, expected err %s", err.Error(), expectedError) | ||||
| 			if err != nil { | ||||
| 				if diff := cmp.Diff(expectedError, err.Error()); diff != "" { | ||||
| 					t.Errorf("IsValidProjectDir() mismatch (-want +got):\n%s", diff) | ||||
| 				} | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -1469,8 +1471,8 @@ func TestDownloadFileInMemory(t *testing.T) { | ||||
| 				t.Errorf("Failed to download file with error %s", err) | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(data, tt.want) { | ||||
| 				t.Errorf("Got: %v, want: %v", data, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, data); diff != "" { | ||||
| 				t.Errorf("DownloadFileInMemory() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -1565,7 +1567,7 @@ func TestValidateURL(t *testing.T) { | ||||
| 				gotErr = true | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(gotErr, tt.wantErr) { | ||||
| 			if gotErr != tt.wantErr { | ||||
| 				t.Errorf("Got %v, want %v", got, tt.wantErr) | ||||
| 			} | ||||
| 		}) | ||||
| @@ -1608,8 +1610,8 @@ func TestValidateFile(t *testing.T) { | ||||
| 			if err != nil { | ||||
| 				gotErr = true | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(gotErr, tt.wantErr) { | ||||
| 				t.Errorf("Got error: %t, want error: %t", gotErr, tt.wantErr) | ||||
| 			if gotErr != tt.wantErr { | ||||
| 				t.Errorf("Got error: %v, want error: %t", err, tt.wantErr) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -1668,8 +1670,8 @@ func TestCopyFile(t *testing.T) { | ||||
| 				gotErr = true | ||||
| 			} | ||||
|  | ||||
| 			if !reflect.DeepEqual(gotErr, tt.wantErr) { | ||||
| 				t.Errorf("Got error: %t, want error: %t", gotErr, tt.wantErr) | ||||
| 			if gotErr != tt.wantErr { | ||||
| 				t.Errorf("Got error: %v, want error: %t", err, tt.wantErr) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -1712,8 +1714,8 @@ func TestPathEqual(t *testing.T) { | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			got := dfutil.PathEqual(tt.firstPath, tt.secondPath) | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("Got: %t, want %t", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("dfutil.PathEqual() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -1750,8 +1752,8 @@ func TestSliceContainsString(t *testing.T) { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			gotVal := sliceContainsString(tt.stringVal, tt.slice) | ||||
|  | ||||
| 			if !reflect.DeepEqual(gotVal, tt.wantVal) { | ||||
| 				t.Errorf("Got %v, want %v", gotVal, tt.wantVal) | ||||
| 			if diff := cmp.Diff(tt.wantVal, gotVal); diff != "" { | ||||
| 				t.Errorf("sliceContainsString() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -2692,8 +2694,8 @@ func TestDisplayLog(t *testing.T) { | ||||
| 				} | ||||
| 				lines = append(lines, line) | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(lines, tt.want) { | ||||
| 				t.Errorf("expected %v, got %v", tt.want, lines) | ||||
| 			if diff := cmp.Diff(tt.want, lines); diff != "" { | ||||
| 				t.Errorf("DisplayLog() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
| @@ -1,9 +1,10 @@ | ||||
| package vars | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
|  | ||||
| 	"github.com/redhat-developer/odo/pkg/testingutil/filesystem" | ||||
| ) | ||||
|  | ||||
| @@ -92,8 +93,8 @@ G | ||||
| 				t.Errorf("parseKeyValueFile() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("parseKeyValueFile() = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("parseKeyValueFile() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -164,8 +165,8 @@ func Test_parseKeyValueStrings(t *testing.T) { | ||||
| 				t.Errorf("parseKeyValueStrings() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("parseKeyValueStrings() = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("parseKeyValueStrings() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -311,8 +312,8 @@ func TestGetVariables(t *testing.T) { | ||||
| 				t.Errorf("GetVariables() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("GetVariables() = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("GetVariables() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| @@ -355,8 +356,8 @@ func TestGetVariablesEmptyFilename(t *testing.T) { | ||||
| 				t.Errorf("GetVariables() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("GetVariables() = %v, want %v", got, tt.want) | ||||
| 			if diff := cmp.Diff(tt.want, got); diff != "" { | ||||
| 				t.Errorf("GetVariables() mismatch (-want +got):\n%s", diff) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										156
									
								
								vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,156 @@ | ||||
| // Copyright 2017, 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 cmpopts provides common options for the cmp package. | ||||
| package cmpopts | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"math" | ||||
| 	"reflect" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| ) | ||||
|  | ||||
| func equateAlways(_, _ interface{}) bool { return true } | ||||
|  | ||||
| // EquateEmpty returns a Comparer option that determines all maps and slices | ||||
| // with a length of zero to be equal, regardless of whether they are nil. | ||||
| // | ||||
| // EquateEmpty can be used in conjunction with SortSlices and SortMaps. | ||||
| func EquateEmpty() cmp.Option { | ||||
| 	return cmp.FilterValues(isEmpty, cmp.Comparer(equateAlways)) | ||||
| } | ||||
|  | ||||
| func isEmpty(x, y interface{}) bool { | ||||
| 	vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) | ||||
| 	return (x != nil && y != nil && vx.Type() == vy.Type()) && | ||||
| 		(vx.Kind() == reflect.Slice || vx.Kind() == reflect.Map) && | ||||
| 		(vx.Len() == 0 && vy.Len() == 0) | ||||
| } | ||||
|  | ||||
| // EquateApprox returns a Comparer option that determines float32 or float64 | ||||
| // values to be equal if they are within a relative fraction or absolute margin. | ||||
| // This option is not used when either x or y is NaN or infinite. | ||||
| // | ||||
| // The fraction determines that the difference of two values must be within the | ||||
| // smaller fraction of the two values, while the margin determines that the two | ||||
| // values must be within some absolute margin. | ||||
| // To express only a fraction or only a margin, use 0 for the other parameter. | ||||
| // The fraction and margin must be non-negative. | ||||
| // | ||||
| // The mathematical expression used is equivalent to: | ||||
| // | ||||
| //	|x-y| ≤ max(fraction*min(|x|, |y|), margin) | ||||
| // | ||||
| // EquateApprox can be used in conjunction with EquateNaNs. | ||||
| func EquateApprox(fraction, margin float64) cmp.Option { | ||||
| 	if margin < 0 || fraction < 0 || math.IsNaN(margin) || math.IsNaN(fraction) { | ||||
| 		panic("margin or fraction must be a non-negative number") | ||||
| 	} | ||||
| 	a := approximator{fraction, margin} | ||||
| 	return cmp.Options{ | ||||
| 		cmp.FilterValues(areRealF64s, cmp.Comparer(a.compareF64)), | ||||
| 		cmp.FilterValues(areRealF32s, cmp.Comparer(a.compareF32)), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type approximator struct{ frac, marg float64 } | ||||
|  | ||||
| func areRealF64s(x, y float64) bool { | ||||
| 	return !math.IsNaN(x) && !math.IsNaN(y) && !math.IsInf(x, 0) && !math.IsInf(y, 0) | ||||
| } | ||||
| func areRealF32s(x, y float32) bool { | ||||
| 	return areRealF64s(float64(x), float64(y)) | ||||
| } | ||||
| func (a approximator) compareF64(x, y float64) bool { | ||||
| 	relMarg := a.frac * math.Min(math.Abs(x), math.Abs(y)) | ||||
| 	return math.Abs(x-y) <= math.Max(a.marg, relMarg) | ||||
| } | ||||
| func (a approximator) compareF32(x, y float32) bool { | ||||
| 	return a.compareF64(float64(x), float64(y)) | ||||
| } | ||||
|  | ||||
| // EquateNaNs returns a Comparer option that determines float32 and float64 | ||||
| // NaN values to be equal. | ||||
| // | ||||
| // EquateNaNs can be used in conjunction with EquateApprox. | ||||
| func EquateNaNs() cmp.Option { | ||||
| 	return cmp.Options{ | ||||
| 		cmp.FilterValues(areNaNsF64s, cmp.Comparer(equateAlways)), | ||||
| 		cmp.FilterValues(areNaNsF32s, cmp.Comparer(equateAlways)), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func areNaNsF64s(x, y float64) bool { | ||||
| 	return math.IsNaN(x) && math.IsNaN(y) | ||||
| } | ||||
| func areNaNsF32s(x, y float32) bool { | ||||
| 	return areNaNsF64s(float64(x), float64(y)) | ||||
| } | ||||
|  | ||||
| // EquateApproxTime returns a Comparer option that determines two non-zero | ||||
| // time.Time values to be equal if they are within some margin of one another. | ||||
| // If both times have a monotonic clock reading, then the monotonic time | ||||
| // difference will be used. The margin must be non-negative. | ||||
| func EquateApproxTime(margin time.Duration) cmp.Option { | ||||
| 	if margin < 0 { | ||||
| 		panic("margin must be a non-negative number") | ||||
| 	} | ||||
| 	a := timeApproximator{margin} | ||||
| 	return cmp.FilterValues(areNonZeroTimes, cmp.Comparer(a.compare)) | ||||
| } | ||||
|  | ||||
| func areNonZeroTimes(x, y time.Time) bool { | ||||
| 	return !x.IsZero() && !y.IsZero() | ||||
| } | ||||
|  | ||||
| type timeApproximator struct { | ||||
| 	margin time.Duration | ||||
| } | ||||
|  | ||||
| func (a timeApproximator) compare(x, y time.Time) bool { | ||||
| 	// Avoid subtracting times to avoid overflow when the | ||||
| 	// difference is larger than the largest representable duration. | ||||
| 	if x.After(y) { | ||||
| 		// Ensure x is always before y | ||||
| 		x, y = y, x | ||||
| 	} | ||||
| 	// We're within the margin if x+margin >= y. | ||||
| 	// Note: time.Time doesn't have AfterOrEqual method hence the negation. | ||||
| 	return !x.Add(a.margin).Before(y) | ||||
| } | ||||
|  | ||||
| // AnyError is an error that matches any non-nil error. | ||||
| var AnyError anyError | ||||
|  | ||||
| type anyError struct{} | ||||
|  | ||||
| func (anyError) Error() string     { return "any error" } | ||||
| func (anyError) Is(err error) bool { return err != nil } | ||||
|  | ||||
| // EquateErrors returns a Comparer option that determines errors to be equal | ||||
| // if errors.Is reports them to match. The AnyError error can be used to | ||||
| // match any non-nil error. | ||||
| func EquateErrors() cmp.Option { | ||||
| 	return cmp.FilterValues(areConcreteErrors, cmp.Comparer(compareErrors)) | ||||
| } | ||||
|  | ||||
| // areConcreteErrors reports whether x and y are types that implement error. | ||||
| // The input types are deliberately of the interface{} type rather than the | ||||
| // error type so that we can handle situations where the current type is an | ||||
| // interface{}, but the underlying concrete types both happen to implement | ||||
| // the error interface. | ||||
| func areConcreteErrors(x, y interface{}) bool { | ||||
| 	_, ok1 := x.(error) | ||||
| 	_, ok2 := y.(error) | ||||
| 	return ok1 && ok2 | ||||
| } | ||||
|  | ||||
| func compareErrors(x, y interface{}) bool { | ||||
| 	xe := x.(error) | ||||
| 	ye := y.(error) | ||||
| 	return errors.Is(xe, ye) || errors.Is(ye, xe) | ||||
| } | ||||
							
								
								
									
										206
									
								
								vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,206 @@ | ||||
| // Copyright 2017, 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 cmpopts | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"unicode" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	"github.com/google/go-cmp/cmp/internal/function" | ||||
| ) | ||||
|  | ||||
| // IgnoreFields returns an Option that ignores fields of the | ||||
| // given names on a single struct type. It respects the names of exported fields | ||||
| // that are forwarded due to struct embedding. | ||||
| // The struct type is specified by passing in a value of that type. | ||||
| // | ||||
| // The name may be a dot-delimited string (e.g., "Foo.Bar") to ignore a | ||||
| // specific sub-field that is embedded or nested within the parent struct. | ||||
| func IgnoreFields(typ interface{}, names ...string) cmp.Option { | ||||
| 	sf := newStructFilter(typ, names...) | ||||
| 	return cmp.FilterPath(sf.filter, cmp.Ignore()) | ||||
| } | ||||
|  | ||||
| // IgnoreTypes returns an Option that ignores all values assignable to | ||||
| // certain types, which are specified by passing in a value of each type. | ||||
| func IgnoreTypes(typs ...interface{}) cmp.Option { | ||||
| 	tf := newTypeFilter(typs...) | ||||
| 	return cmp.FilterPath(tf.filter, cmp.Ignore()) | ||||
| } | ||||
|  | ||||
| type typeFilter []reflect.Type | ||||
|  | ||||
| func newTypeFilter(typs ...interface{}) (tf typeFilter) { | ||||
| 	for _, typ := range typs { | ||||
| 		t := reflect.TypeOf(typ) | ||||
| 		if t == nil { | ||||
| 			// This occurs if someone tries to pass in sync.Locker(nil) | ||||
| 			panic("cannot determine type; consider using IgnoreInterfaces") | ||||
| 		} | ||||
| 		tf = append(tf, t) | ||||
| 	} | ||||
| 	return tf | ||||
| } | ||||
| func (tf typeFilter) filter(p cmp.Path) bool { | ||||
| 	if len(p) < 1 { | ||||
| 		return false | ||||
| 	} | ||||
| 	t := p.Last().Type() | ||||
| 	for _, ti := range tf { | ||||
| 		if t.AssignableTo(ti) { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // IgnoreInterfaces returns an Option that ignores all values or references of | ||||
| // values assignable to certain interface types. These interfaces are specified | ||||
| // by passing in an anonymous struct with the interface types embedded in it. | ||||
| // For example, to ignore sync.Locker, pass in struct{sync.Locker}{}. | ||||
| func IgnoreInterfaces(ifaces interface{}) cmp.Option { | ||||
| 	tf := newIfaceFilter(ifaces) | ||||
| 	return cmp.FilterPath(tf.filter, cmp.Ignore()) | ||||
| } | ||||
|  | ||||
| type ifaceFilter []reflect.Type | ||||
|  | ||||
| func newIfaceFilter(ifaces interface{}) (tf ifaceFilter) { | ||||
| 	t := reflect.TypeOf(ifaces) | ||||
| 	if ifaces == nil || t.Name() != "" || t.Kind() != reflect.Struct { | ||||
| 		panic("input must be an anonymous struct") | ||||
| 	} | ||||
| 	for i := 0; i < t.NumField(); i++ { | ||||
| 		fi := t.Field(i) | ||||
| 		switch { | ||||
| 		case !fi.Anonymous: | ||||
| 			panic("struct cannot have named fields") | ||||
| 		case fi.Type.Kind() != reflect.Interface: | ||||
| 			panic("embedded field must be an interface type") | ||||
| 		case fi.Type.NumMethod() == 0: | ||||
| 			// This matches everything; why would you ever want this? | ||||
| 			panic("cannot ignore empty interface") | ||||
| 		default: | ||||
| 			tf = append(tf, fi.Type) | ||||
| 		} | ||||
| 	} | ||||
| 	return tf | ||||
| } | ||||
| func (tf ifaceFilter) filter(p cmp.Path) bool { | ||||
| 	if len(p) < 1 { | ||||
| 		return false | ||||
| 	} | ||||
| 	t := p.Last().Type() | ||||
| 	for _, ti := range tf { | ||||
| 		if t.AssignableTo(ti) { | ||||
| 			return true | ||||
| 		} | ||||
| 		if t.Kind() != reflect.Ptr && reflect.PtrTo(t).AssignableTo(ti) { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // IgnoreUnexported returns an Option that only ignores the immediate unexported | ||||
| // fields of a struct, including anonymous fields of unexported types. | ||||
| // In particular, unexported fields within the struct's exported fields | ||||
| // of struct types, including anonymous fields, will not be ignored unless the | ||||
| // type of the field itself is also passed to IgnoreUnexported. | ||||
| // | ||||
| // Avoid ignoring unexported fields of a type which you do not control (i.e. a | ||||
| // type from another repository), as changes to the implementation of such types | ||||
| // may change how the comparison behaves. Prefer a custom Comparer instead. | ||||
| func IgnoreUnexported(typs ...interface{}) cmp.Option { | ||||
| 	ux := newUnexportedFilter(typs...) | ||||
| 	return cmp.FilterPath(ux.filter, cmp.Ignore()) | ||||
| } | ||||
|  | ||||
| type unexportedFilter struct{ m map[reflect.Type]bool } | ||||
|  | ||||
| func newUnexportedFilter(typs ...interface{}) unexportedFilter { | ||||
| 	ux := unexportedFilter{m: make(map[reflect.Type]bool)} | ||||
| 	for _, typ := range typs { | ||||
| 		t := reflect.TypeOf(typ) | ||||
| 		if t == nil || t.Kind() != reflect.Struct { | ||||
| 			panic(fmt.Sprintf("%T must be a non-pointer struct", typ)) | ||||
| 		} | ||||
| 		ux.m[t] = true | ||||
| 	} | ||||
| 	return ux | ||||
| } | ||||
| func (xf unexportedFilter) filter(p cmp.Path) bool { | ||||
| 	sf, ok := p.Index(-1).(cmp.StructField) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	return xf.m[p.Index(-2).Type()] && !isExported(sf.Name()) | ||||
| } | ||||
|  | ||||
| // isExported reports whether the identifier is exported. | ||||
| func isExported(id string) bool { | ||||
| 	r, _ := utf8.DecodeRuneInString(id) | ||||
| 	return unicode.IsUpper(r) | ||||
| } | ||||
|  | ||||
| // IgnoreSliceElements returns an Option that ignores elements of []V. | ||||
| // The discard function must be of the form "func(T) bool" which is used to | ||||
| // ignore slice elements of type V, where V is assignable to T. | ||||
| // Elements are ignored if the function reports true. | ||||
| func IgnoreSliceElements(discardFunc interface{}) cmp.Option { | ||||
| 	vf := reflect.ValueOf(discardFunc) | ||||
| 	if !function.IsType(vf.Type(), function.ValuePredicate) || vf.IsNil() { | ||||
| 		panic(fmt.Sprintf("invalid discard function: %T", discardFunc)) | ||||
| 	} | ||||
| 	return cmp.FilterPath(func(p cmp.Path) bool { | ||||
| 		si, ok := p.Index(-1).(cmp.SliceIndex) | ||||
| 		if !ok { | ||||
| 			return false | ||||
| 		} | ||||
| 		if !si.Type().AssignableTo(vf.Type().In(0)) { | ||||
| 			return false | ||||
| 		} | ||||
| 		vx, vy := si.Values() | ||||
| 		if vx.IsValid() && vf.Call([]reflect.Value{vx})[0].Bool() { | ||||
| 			return true | ||||
| 		} | ||||
| 		if vy.IsValid() && vf.Call([]reflect.Value{vy})[0].Bool() { | ||||
| 			return true | ||||
| 		} | ||||
| 		return false | ||||
| 	}, cmp.Ignore()) | ||||
| } | ||||
|  | ||||
| // IgnoreMapEntries returns an Option that ignores entries of map[K]V. | ||||
| // The discard function must be of the form "func(T, R) bool" which is used to | ||||
| // ignore map entries of type K and V, where K and V are assignable to T and R. | ||||
| // Entries are ignored if the function reports true. | ||||
| func IgnoreMapEntries(discardFunc interface{}) cmp.Option { | ||||
| 	vf := reflect.ValueOf(discardFunc) | ||||
| 	if !function.IsType(vf.Type(), function.KeyValuePredicate) || vf.IsNil() { | ||||
| 		panic(fmt.Sprintf("invalid discard function: %T", discardFunc)) | ||||
| 	} | ||||
| 	return cmp.FilterPath(func(p cmp.Path) bool { | ||||
| 		mi, ok := p.Index(-1).(cmp.MapIndex) | ||||
| 		if !ok { | ||||
| 			return false | ||||
| 		} | ||||
| 		if !mi.Key().Type().AssignableTo(vf.Type().In(0)) || !mi.Type().AssignableTo(vf.Type().In(1)) { | ||||
| 			return false | ||||
| 		} | ||||
| 		k := mi.Key() | ||||
| 		vx, vy := mi.Values() | ||||
| 		if vx.IsValid() && vf.Call([]reflect.Value{k, vx})[0].Bool() { | ||||
| 			return true | ||||
| 		} | ||||
| 		if vy.IsValid() && vf.Call([]reflect.Value{k, vy})[0].Bool() { | ||||
| 			return true | ||||
| 		} | ||||
| 		return false | ||||
| 	}, cmp.Ignore()) | ||||
| } | ||||
							
								
								
									
										147
									
								
								vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
| // Copyright 2017, 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 cmpopts | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"sort" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| 	"github.com/google/go-cmp/cmp/internal/function" | ||||
| ) | ||||
|  | ||||
| // SortSlices returns a Transformer option that sorts all []V. | ||||
| // The less function must be of the form "func(T, T) bool" which is used to | ||||
| // sort any slice with element type V that is assignable to T. | ||||
| // | ||||
| // The less function must be: | ||||
| //   - Deterministic: less(x, y) == less(x, y) | ||||
| //   - Irreflexive: !less(x, x) | ||||
| //   - Transitive: if !less(x, y) and !less(y, z), then !less(x, z) | ||||
| // | ||||
| // The less function does not have to be "total". That is, if !less(x, y) and | ||||
| // !less(y, x) for two elements x and y, their relative order is maintained. | ||||
| // | ||||
| // SortSlices can be used in conjunction with EquateEmpty. | ||||
| func SortSlices(lessFunc interface{}) cmp.Option { | ||||
| 	vf := reflect.ValueOf(lessFunc) | ||||
| 	if !function.IsType(vf.Type(), function.Less) || vf.IsNil() { | ||||
| 		panic(fmt.Sprintf("invalid less function: %T", lessFunc)) | ||||
| 	} | ||||
| 	ss := sliceSorter{vf.Type().In(0), vf} | ||||
| 	return cmp.FilterValues(ss.filter, cmp.Transformer("cmpopts.SortSlices", ss.sort)) | ||||
| } | ||||
|  | ||||
| type sliceSorter struct { | ||||
| 	in  reflect.Type  // T | ||||
| 	fnc reflect.Value // func(T, T) bool | ||||
| } | ||||
|  | ||||
| func (ss sliceSorter) filter(x, y interface{}) bool { | ||||
| 	vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) | ||||
| 	if !(x != nil && y != nil && vx.Type() == vy.Type()) || | ||||
| 		!(vx.Kind() == reflect.Slice && vx.Type().Elem().AssignableTo(ss.in)) || | ||||
| 		(vx.Len() <= 1 && vy.Len() <= 1) { | ||||
| 		return false | ||||
| 	} | ||||
| 	// Check whether the slices are already sorted to avoid an infinite | ||||
| 	// recursion cycle applying the same transform to itself. | ||||
| 	ok1 := sort.SliceIsSorted(x, func(i, j int) bool { return ss.less(vx, i, j) }) | ||||
| 	ok2 := sort.SliceIsSorted(y, func(i, j int) bool { return ss.less(vy, i, j) }) | ||||
| 	return !ok1 || !ok2 | ||||
| } | ||||
| func (ss sliceSorter) sort(x interface{}) interface{} { | ||||
| 	src := reflect.ValueOf(x) | ||||
| 	dst := reflect.MakeSlice(src.Type(), src.Len(), src.Len()) | ||||
| 	for i := 0; i < src.Len(); i++ { | ||||
| 		dst.Index(i).Set(src.Index(i)) | ||||
| 	} | ||||
| 	sort.SliceStable(dst.Interface(), func(i, j int) bool { return ss.less(dst, i, j) }) | ||||
| 	ss.checkSort(dst) | ||||
| 	return dst.Interface() | ||||
| } | ||||
| func (ss sliceSorter) checkSort(v reflect.Value) { | ||||
| 	start := -1 // Start of a sequence of equal elements. | ||||
| 	for i := 1; i < v.Len(); i++ { | ||||
| 		if ss.less(v, i-1, i) { | ||||
| 			// Check that first and last elements in v[start:i] are equal. | ||||
| 			if start >= 0 && (ss.less(v, start, i-1) || ss.less(v, i-1, start)) { | ||||
| 				panic(fmt.Sprintf("incomparable values detected: want equal elements: %v", v.Slice(start, i))) | ||||
| 			} | ||||
| 			start = -1 | ||||
| 		} else if start == -1 { | ||||
| 			start = i | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| func (ss sliceSorter) less(v reflect.Value, i, j int) bool { | ||||
| 	vx, vy := v.Index(i), v.Index(j) | ||||
| 	return ss.fnc.Call([]reflect.Value{vx, vy})[0].Bool() | ||||
| } | ||||
|  | ||||
| // SortMaps returns a Transformer option that flattens map[K]V types to be a | ||||
| // sorted []struct{K, V}. The less function must be of the form | ||||
| // "func(T, T) bool" which is used to sort any map with key K that is | ||||
| // assignable to T. | ||||
| // | ||||
| // Flattening the map into a slice has the property that cmp.Equal is able to | ||||
| // use Comparers on K or the K.Equal method if it exists. | ||||
| // | ||||
| // The less function must be: | ||||
| //   - Deterministic: less(x, y) == less(x, y) | ||||
| //   - Irreflexive: !less(x, x) | ||||
| //   - Transitive: if !less(x, y) and !less(y, z), then !less(x, z) | ||||
| //   - Total: if x != y, then either less(x, y) or less(y, x) | ||||
| // | ||||
| // SortMaps can be used in conjunction with EquateEmpty. | ||||
| func SortMaps(lessFunc interface{}) cmp.Option { | ||||
| 	vf := reflect.ValueOf(lessFunc) | ||||
| 	if !function.IsType(vf.Type(), function.Less) || vf.IsNil() { | ||||
| 		panic(fmt.Sprintf("invalid less function: %T", lessFunc)) | ||||
| 	} | ||||
| 	ms := mapSorter{vf.Type().In(0), vf} | ||||
| 	return cmp.FilterValues(ms.filter, cmp.Transformer("cmpopts.SortMaps", ms.sort)) | ||||
| } | ||||
|  | ||||
| type mapSorter struct { | ||||
| 	in  reflect.Type  // T | ||||
| 	fnc reflect.Value // func(T, T) bool | ||||
| } | ||||
|  | ||||
| func (ms mapSorter) filter(x, y interface{}) bool { | ||||
| 	vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) | ||||
| 	return (x != nil && y != nil && vx.Type() == vy.Type()) && | ||||
| 		(vx.Kind() == reflect.Map && vx.Type().Key().AssignableTo(ms.in)) && | ||||
| 		(vx.Len() != 0 || vy.Len() != 0) | ||||
| } | ||||
| func (ms mapSorter) sort(x interface{}) interface{} { | ||||
| 	src := reflect.ValueOf(x) | ||||
| 	outType := reflect.StructOf([]reflect.StructField{ | ||||
| 		{Name: "K", Type: src.Type().Key()}, | ||||
| 		{Name: "V", Type: src.Type().Elem()}, | ||||
| 	}) | ||||
| 	dst := reflect.MakeSlice(reflect.SliceOf(outType), src.Len(), src.Len()) | ||||
| 	for i, k := range src.MapKeys() { | ||||
| 		v := reflect.New(outType).Elem() | ||||
| 		v.Field(0).Set(k) | ||||
| 		v.Field(1).Set(src.MapIndex(k)) | ||||
| 		dst.Index(i).Set(v) | ||||
| 	} | ||||
| 	sort.Slice(dst.Interface(), func(i, j int) bool { return ms.less(dst, i, j) }) | ||||
| 	ms.checkSort(dst) | ||||
| 	return dst.Interface() | ||||
| } | ||||
| func (ms mapSorter) checkSort(v reflect.Value) { | ||||
| 	for i := 1; i < v.Len(); i++ { | ||||
| 		if !ms.less(v, i-1, i) { | ||||
| 			panic(fmt.Sprintf("partial order detected: want %v < %v", v.Index(i-1), v.Index(i))) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| func (ms mapSorter) less(v reflect.Value, i, j int) bool { | ||||
| 	vx, vy := v.Index(i).Field(0), v.Index(j).Field(0) | ||||
| 	return ms.fnc.Call([]reflect.Value{vx, vy})[0].Bool() | ||||
| } | ||||
							
								
								
									
										189
									
								
								vendor/github.com/google/go-cmp/cmp/cmpopts/struct_filter.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								vendor/github.com/google/go-cmp/cmp/cmpopts/struct_filter.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,189 @@ | ||||
| // Copyright 2017, 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 cmpopts | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| ) | ||||
|  | ||||
| // filterField returns a new Option where opt is only evaluated on paths that | ||||
| // include a specific exported field on a single struct type. | ||||
| // The struct type is specified by passing in a value of that type. | ||||
| // | ||||
| // The name may be a dot-delimited string (e.g., "Foo.Bar") to select a | ||||
| // specific sub-field that is embedded or nested within the parent struct. | ||||
| func filterField(typ interface{}, name string, opt cmp.Option) cmp.Option { | ||||
| 	// TODO: This is currently unexported over concerns of how helper filters | ||||
| 	// can be composed together easily. | ||||
| 	// TODO: Add tests for FilterField. | ||||
|  | ||||
| 	sf := newStructFilter(typ, name) | ||||
| 	return cmp.FilterPath(sf.filter, opt) | ||||
| } | ||||
|  | ||||
| type structFilter struct { | ||||
| 	t  reflect.Type // The root struct type to match on | ||||
| 	ft fieldTree    // Tree of fields to match on | ||||
| } | ||||
|  | ||||
| func newStructFilter(typ interface{}, names ...string) structFilter { | ||||
| 	// TODO: Perhaps allow * as a special identifier to allow ignoring any | ||||
| 	// number of path steps until the next field match? | ||||
| 	// This could be useful when a concrete struct gets transformed into | ||||
| 	// an anonymous struct where it is not possible to specify that by type, | ||||
| 	// but the transformer happens to provide guarantees about the names of | ||||
| 	// the transformed fields. | ||||
|  | ||||
| 	t := reflect.TypeOf(typ) | ||||
| 	if t == nil || t.Kind() != reflect.Struct { | ||||
| 		panic(fmt.Sprintf("%T must be a non-pointer struct", typ)) | ||||
| 	} | ||||
| 	var ft fieldTree | ||||
| 	for _, name := range names { | ||||
| 		cname, err := canonicalName(t, name) | ||||
| 		if err != nil { | ||||
| 			panic(fmt.Sprintf("%s: %v", strings.Join(cname, "."), err)) | ||||
| 		} | ||||
| 		ft.insert(cname) | ||||
| 	} | ||||
| 	return structFilter{t, ft} | ||||
| } | ||||
|  | ||||
| func (sf structFilter) filter(p cmp.Path) bool { | ||||
| 	for i, ps := range p { | ||||
| 		if ps.Type().AssignableTo(sf.t) && sf.ft.matchPrefix(p[i+1:]) { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // fieldTree represents a set of dot-separated identifiers. | ||||
| // | ||||
| // For example, inserting the following selectors: | ||||
| // | ||||
| //	Foo | ||||
| //	Foo.Bar.Baz | ||||
| //	Foo.Buzz | ||||
| //	Nuka.Cola.Quantum | ||||
| // | ||||
| // Results in a tree of the form: | ||||
| // | ||||
| //	{sub: { | ||||
| //		"Foo": {ok: true, sub: { | ||||
| //			"Bar": {sub: { | ||||
| //				"Baz": {ok: true}, | ||||
| //			}}, | ||||
| //			"Buzz": {ok: true}, | ||||
| //		}}, | ||||
| //		"Nuka": {sub: { | ||||
| //			"Cola": {sub: { | ||||
| //				"Quantum": {ok: true}, | ||||
| //			}}, | ||||
| //		}}, | ||||
| //	}} | ||||
| type fieldTree struct { | ||||
| 	ok  bool                 // Whether this is a specified node | ||||
| 	sub map[string]fieldTree // The sub-tree of fields under this node | ||||
| } | ||||
|  | ||||
| // insert inserts a sequence of field accesses into the tree. | ||||
| func (ft *fieldTree) insert(cname []string) { | ||||
| 	if ft.sub == nil { | ||||
| 		ft.sub = make(map[string]fieldTree) | ||||
| 	} | ||||
| 	if len(cname) == 0 { | ||||
| 		ft.ok = true | ||||
| 		return | ||||
| 	} | ||||
| 	sub := ft.sub[cname[0]] | ||||
| 	sub.insert(cname[1:]) | ||||
| 	ft.sub[cname[0]] = sub | ||||
| } | ||||
|  | ||||
| // matchPrefix reports whether any selector in the fieldTree matches | ||||
| // the start of path p. | ||||
| func (ft fieldTree) matchPrefix(p cmp.Path) bool { | ||||
| 	for _, ps := range p { | ||||
| 		switch ps := ps.(type) { | ||||
| 		case cmp.StructField: | ||||
| 			ft = ft.sub[ps.Name()] | ||||
| 			if ft.ok { | ||||
| 				return true | ||||
| 			} | ||||
| 			if len(ft.sub) == 0 { | ||||
| 				return false | ||||
| 			} | ||||
| 		case cmp.Indirect: | ||||
| 		default: | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // canonicalName returns a list of identifiers where any struct field access | ||||
| // through an embedded field is expanded to include the names of the embedded | ||||
| // types themselves. | ||||
| // | ||||
| // For example, suppose field "Foo" is not directly in the parent struct, | ||||
| // but actually from an embedded struct of type "Bar". Then, the canonical name | ||||
| // of "Foo" is actually "Bar.Foo". | ||||
| // | ||||
| // Suppose field "Foo" is not directly in the parent struct, but actually | ||||
| // a field in two different embedded structs of types "Bar" and "Baz". | ||||
| // Then the selector "Foo" causes a panic since it is ambiguous which one it | ||||
| // refers to. The user must specify either "Bar.Foo" or "Baz.Foo". | ||||
| func canonicalName(t reflect.Type, sel string) ([]string, error) { | ||||
| 	var name string | ||||
| 	sel = strings.TrimPrefix(sel, ".") | ||||
| 	if sel == "" { | ||||
| 		return nil, fmt.Errorf("name must not be empty") | ||||
| 	} | ||||
| 	if i := strings.IndexByte(sel, '.'); i < 0 { | ||||
| 		name, sel = sel, "" | ||||
| 	} else { | ||||
| 		name, sel = sel[:i], sel[i:] | ||||
| 	} | ||||
|  | ||||
| 	// Type must be a struct or pointer to struct. | ||||
| 	if t.Kind() == reflect.Ptr { | ||||
| 		t = t.Elem() | ||||
| 	} | ||||
| 	if t.Kind() != reflect.Struct { | ||||
| 		return nil, fmt.Errorf("%v must be a struct", t) | ||||
| 	} | ||||
|  | ||||
| 	// Find the canonical name for this current field name. | ||||
| 	// If the field exists in an embedded struct, then it will be expanded. | ||||
| 	sf, _ := t.FieldByName(name) | ||||
| 	if !isExported(name) { | ||||
| 		// Avoid using reflect.Type.FieldByName for unexported fields due to | ||||
| 		// buggy behavior with regard to embeddeding and unexported fields. | ||||
| 		// See https://golang.org/issue/4876 for details. | ||||
| 		sf = reflect.StructField{} | ||||
| 		for i := 0; i < t.NumField() && sf.Name == ""; i++ { | ||||
| 			if t.Field(i).Name == name { | ||||
| 				sf = t.Field(i) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if sf.Name == "" { | ||||
| 		return []string{name}, fmt.Errorf("does not exist") | ||||
| 	} | ||||
| 	var ss []string | ||||
| 	for i := range sf.Index { | ||||
| 		ss = append(ss, t.FieldByIndex(sf.Index[:i+1]).Name) | ||||
| 	} | ||||
| 	if sel == "" { | ||||
| 		return ss, nil | ||||
| 	} | ||||
| 	ssPost, err := canonicalName(sf.Type, sel) | ||||
| 	return append(ss, ssPost...), err | ||||
| } | ||||
							
								
								
									
										36
									
								
								vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| // Copyright 2018, 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 cmpopts | ||||
|  | ||||
| import ( | ||||
| 	"github.com/google/go-cmp/cmp" | ||||
| ) | ||||
|  | ||||
| type xformFilter struct{ xform cmp.Option } | ||||
|  | ||||
| func (xf xformFilter) filter(p cmp.Path) bool { | ||||
| 	for _, ps := range p { | ||||
| 		if t, ok := ps.(cmp.Transform); ok && t.Option() == xf.xform { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // AcyclicTransformer returns a Transformer with a filter applied that ensures | ||||
| // that the transformer cannot be recursively applied upon its own output. | ||||
| // | ||||
| // An example use case is a transformer that splits a string by lines: | ||||
| // | ||||
| //	AcyclicTransformer("SplitLines", func(s string) []string{ | ||||
| //		return strings.Split(s, "\n") | ||||
| //	}) | ||||
| // | ||||
| // Had this been an unfiltered Transformer instead, this would result in an | ||||
| // infinite cycle converting a string to []string to [][]string and so on. | ||||
| func AcyclicTransformer(name string, xformFunc interface{}) cmp.Option { | ||||
| 	xf := xformFilter{cmp.Transformer(name, xformFunc)} | ||||
| 	return cmp.FilterPath(xf.filter, xf.xform) | ||||
| } | ||||
							
								
								
									
										64
									
								
								vendor/github.com/google/go-cmp/cmp/compare.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								vendor/github.com/google/go-cmp/cmp/compare.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -13,21 +13,21 @@ | ||||
| // | ||||
| // The primary features of cmp are: | ||||
| // | ||||
| // • When the default behavior of equality does not suit the needs of the test, | ||||
| // custom equality functions can override the equality operation. | ||||
| // For example, an equality function may report floats as equal so long as they | ||||
| // are within some tolerance of each other. | ||||
| //   - When the default behavior of equality does not suit the test's needs, | ||||
| //     custom equality functions can override the equality operation. | ||||
| //     For example, an equality function may report floats as equal so long as | ||||
| //     they are within some tolerance of each other. | ||||
| // | ||||
| // • Types that have an Equal method may use that method to determine equality. | ||||
| // This allows package authors to determine the equality operation for the types | ||||
| // that they define. | ||||
| //   - Types with an Equal method may use that method to determine equality. | ||||
| //     This allows package authors to determine the equality operation | ||||
| //     for the types that they define. | ||||
| // | ||||
| // • If no custom equality functions are used and no Equal method is defined, | ||||
| // equality is determined by recursively comparing the primitive kinds on both | ||||
| // values, much like reflect.DeepEqual. Unlike reflect.DeepEqual, unexported | ||||
| // fields are not compared by default; they result in panics unless suppressed | ||||
| // by using an Ignore option (see cmpopts.IgnoreUnexported) or explicitly | ||||
| // compared using the Exporter option. | ||||
| //   - If no custom equality functions are used and no Equal method is defined, | ||||
| //     equality is determined by recursively comparing the primitive kinds on | ||||
| //     both values, much like reflect.DeepEqual. Unlike reflect.DeepEqual, | ||||
| //     unexported fields are not compared by default; they result in panics | ||||
| //     unless suppressed by using an Ignore option (see cmpopts.IgnoreUnexported) | ||||
| //     or explicitly compared using the Exporter option. | ||||
| package cmp | ||||
|  | ||||
| import ( | ||||
| @@ -45,25 +45,25 @@ import ( | ||||
| // Equal reports whether x and y are equal by recursively applying the | ||||
| // following rules in the given order to x and y and all of their sub-values: | ||||
| // | ||||
| // • Let S be the set of all Ignore, Transformer, and Comparer options that | ||||
| // remain after applying all path filters, value filters, and type filters. | ||||
| // If at least one Ignore exists in S, then the comparison is ignored. | ||||
| // If the number of Transformer and Comparer options in S is greater than one, | ||||
| // then Equal panics because it is ambiguous which option to use. | ||||
| // If S contains a single Transformer, then use that to transform the current | ||||
| // values and recursively call Equal on the output values. | ||||
| // If S contains a single Comparer, then use that to compare the current values. | ||||
| // Otherwise, evaluation proceeds to the next rule. | ||||
| //   - Let S be the set of all Ignore, Transformer, and Comparer options that | ||||
| //     remain after applying all path filters, value filters, and type filters. | ||||
| //     If at least one Ignore exists in S, then the comparison is ignored. | ||||
| //     If the number of Transformer and Comparer options in S is non-zero, | ||||
| //     then Equal panics because it is ambiguous which option to use. | ||||
| //     If S contains a single Transformer, then use that to transform | ||||
| //     the current values and recursively call Equal on the output values. | ||||
| //     If S contains a single Comparer, then use that to compare the current values. | ||||
| //     Otherwise, evaluation proceeds to the next rule. | ||||
| // | ||||
| // • If the values have an Equal method of the form "(T) Equal(T) bool" or | ||||
| // "(T) Equal(I) bool" where T is assignable to I, then use the result of | ||||
| // x.Equal(y) even if x or y is nil. Otherwise, no such method exists and | ||||
| // evaluation proceeds to the next rule. | ||||
| //   - If the values have an Equal method of the form "(T) Equal(T) bool" or | ||||
| //     "(T) Equal(I) bool" where T is assignable to I, then use the result of | ||||
| //     x.Equal(y) even if x or y is nil. Otherwise, no such method exists and | ||||
| //     evaluation proceeds to the next rule. | ||||
| // | ||||
| // • Lastly, try to compare x and y based on their basic kinds. | ||||
| // Simple kinds like booleans, integers, floats, complex numbers, strings, and | ||||
| // channels are compared using the equivalent of the == operator in Go. | ||||
| // Functions are only equal if they are both nil, otherwise they are unequal. | ||||
| //   - Lastly, try to compare x and y based on their basic kinds. | ||||
| //     Simple kinds like booleans, integers, floats, complex numbers, strings, | ||||
| //     and channels are compared using the equivalent of the == operator in Go. | ||||
| //     Functions are only equal if they are both nil, otherwise they are unequal. | ||||
| // | ||||
| // Structs are equal if recursively calling Equal on all fields report equal. | ||||
| // If a struct contains unexported fields, Equal panics unless an Ignore option | ||||
| @@ -144,7 +144,7 @@ func rootStep(x, y interface{}) PathStep { | ||||
| 	// so that they have the same parent type. | ||||
| 	var t reflect.Type | ||||
| 	if !vx.IsValid() || !vy.IsValid() || vx.Type() != vy.Type() { | ||||
| 		t = reflect.TypeOf((*interface{})(nil)).Elem() | ||||
| 		t = anyType | ||||
| 		if vx.IsValid() { | ||||
| 			vvx := reflect.New(t).Elem() | ||||
| 			vvx.Set(vx) | ||||
| @@ -639,7 +639,9 @@ type dynChecker struct{ curr, next int } | ||||
| // Next increments the state and reports whether a check should be performed. | ||||
| // | ||||
| // Checks occur every Nth function call, where N is a triangular number: | ||||
| // | ||||
| //	0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 ... | ||||
| // | ||||
| // See https://en.wikipedia.org/wiki/Triangular_number | ||||
| // | ||||
| // This sequence ensures that the cost of checks drops significantly as | ||||
|   | ||||
							
								
								
									
										44
									
								
								vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -127,9 +127,9 @@ var randBool = rand.New(rand.NewSource(time.Now().Unix())).Intn(2) == 0 | ||||
| // This function returns an edit-script, which is a sequence of operations | ||||
| // needed to convert one list into the other. The following invariants for | ||||
| // the edit-script are maintained: | ||||
| //	• eq == (es.Dist()==0) | ||||
| //	• nx == es.LenX() | ||||
| //	• ny == es.LenY() | ||||
| //   - eq == (es.Dist()==0) | ||||
| //   - nx == es.LenX() | ||||
| //   - ny == es.LenY() | ||||
| // | ||||
| // This algorithm is not guaranteed to be an optimal solution (i.e., one that | ||||
| // produces an edit-script with a minimal Levenshtein distance). This algorithm | ||||
| @@ -169,12 +169,13 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { | ||||
| 	// A diagonal edge is equivalent to a matching symbol between both X and Y. | ||||
|  | ||||
| 	// Invariants: | ||||
| 	//	• 0 ≤ fwdPath.X ≤ (fwdFrontier.X, revFrontier.X) ≤ revPath.X ≤ nx | ||||
| 	//	• 0 ≤ fwdPath.Y ≤ (fwdFrontier.Y, revFrontier.Y) ≤ revPath.Y ≤ ny | ||||
| 	//   - 0 ≤ fwdPath.X ≤ (fwdFrontier.X, revFrontier.X) ≤ revPath.X ≤ nx | ||||
| 	//   - 0 ≤ fwdPath.Y ≤ (fwdFrontier.Y, revFrontier.Y) ≤ revPath.Y ≤ ny | ||||
| 	// | ||||
| 	// In general: | ||||
| 	//	• fwdFrontier.X < revFrontier.X | ||||
| 	//	• fwdFrontier.Y < revFrontier.Y | ||||
| 	//   - fwdFrontier.X < revFrontier.X | ||||
| 	//   - fwdFrontier.Y < revFrontier.Y | ||||
| 	// | ||||
| 	// Unless, it is time for the algorithm to terminate. | ||||
| 	fwdPath := path{+1, point{0, 0}, make(EditScript, 0, (nx+ny)/2)} | ||||
| 	revPath := path{-1, point{nx, ny}, make(EditScript, 0)} | ||||
| @@ -195,19 +196,21 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { | ||||
| 	// computing sub-optimal edit-scripts between two lists. | ||||
| 	// | ||||
| 	// The algorithm is approximately as follows: | ||||
| 	//	• Searching for differences switches back-and-forth between | ||||
| 	//	a search that starts at the beginning (the top-left corner), and | ||||
| 	//	a search that starts at the end (the bottom-right corner). The goal of | ||||
| 	//	the search is connect with the search from the opposite corner. | ||||
| 	//	• As we search, we build a path in a greedy manner, where the first | ||||
| 	//	match seen is added to the path (this is sub-optimal, but provides a | ||||
| 	//	decent result in practice). When matches are found, we try the next pair | ||||
| 	//	of symbols in the lists and follow all matches as far as possible. | ||||
| 	//	• When searching for matches, we search along a diagonal going through | ||||
| 	//	through the "frontier" point. If no matches are found, we advance the | ||||
| 	//	frontier towards the opposite corner. | ||||
| 	//	• This algorithm terminates when either the X coordinates or the | ||||
| 	//	Y coordinates of the forward and reverse frontier points ever intersect. | ||||
| 	//   - Searching for differences switches back-and-forth between | ||||
| 	//     a search that starts at the beginning (the top-left corner), and | ||||
| 	//     a search that starts at the end (the bottom-right corner). | ||||
| 	//     The goal of the search is connect with the search | ||||
| 	//     from the opposite corner. | ||||
| 	//   - As we search, we build a path in a greedy manner, | ||||
| 	//     where the first match seen is added to the path (this is sub-optimal, | ||||
| 	//     but provides a decent result in practice). When matches are found, | ||||
| 	//     we try the next pair of symbols in the lists and follow all matches | ||||
| 	//     as far as possible. | ||||
| 	//   - When searching for matches, we search along a diagonal going through | ||||
| 	//     through the "frontier" point. If no matches are found, | ||||
| 	//     we advance the frontier towards the opposite corner. | ||||
| 	//   - This algorithm terminates when either the X coordinates or the | ||||
| 	//     Y coordinates of the forward and reverse frontier points ever intersect. | ||||
|  | ||||
| 	// This algorithm is correct even if searching only in the forward direction | ||||
| 	// or in the reverse direction. We do both because it is commonly observed | ||||
| @@ -389,6 +392,7 @@ type point struct{ X, Y int } | ||||
| func (p *point) add(dx, dy int) { p.X += dx; p.Y += dy } | ||||
|  | ||||
| // zigzag maps a consecutive sequence of integers to a zig-zag sequence. | ||||
| // | ||||
| //	[0 1 2 3 4 5 ...] => [0 -1 +1 -2 +2 ...] | ||||
| func zigzag(x int) int { | ||||
| 	if x&1 != 0 { | ||||
|   | ||||
							
								
								
									
										48
									
								
								vendor/github.com/google/go-cmp/cmp/internal/value/zero.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								vendor/github.com/google/go-cmp/cmp/internal/value/zero.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,48 +0,0 @@ | ||||
| // Copyright 2017, 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 value | ||||
|  | ||||
| import ( | ||||
| 	"math" | ||||
| 	"reflect" | ||||
| ) | ||||
|  | ||||
| // IsZero reports whether v is the zero value. | ||||
| // This does not rely on Interface and so can be used on unexported fields. | ||||
| func IsZero(v reflect.Value) bool { | ||||
| 	switch v.Kind() { | ||||
| 	case reflect.Bool: | ||||
| 		return v.Bool() == false | ||||
| 	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: | ||||
| 		return v.Int() == 0 | ||||
| 	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: | ||||
| 		return v.Uint() == 0 | ||||
| 	case reflect.Float32, reflect.Float64: | ||||
| 		return math.Float64bits(v.Float()) == 0 | ||||
| 	case reflect.Complex64, reflect.Complex128: | ||||
| 		return math.Float64bits(real(v.Complex())) == 0 && math.Float64bits(imag(v.Complex())) == 0 | ||||
| 	case reflect.String: | ||||
| 		return v.String() == "" | ||||
| 	case reflect.UnsafePointer: | ||||
| 		return v.Pointer() == 0 | ||||
| 	case reflect.Chan, reflect.Func, reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice: | ||||
| 		return v.IsNil() | ||||
| 	case reflect.Array: | ||||
| 		for i := 0; i < v.Len(); i++ { | ||||
| 			if !IsZero(v.Index(i)) { | ||||
| 				return false | ||||
| 			} | ||||
| 		} | ||||
| 		return true | ||||
| 	case reflect.Struct: | ||||
| 		for i := 0; i < v.NumField(); i++ { | ||||
| 			if !IsZero(v.Field(i)) { | ||||
| 				return false | ||||
| 			} | ||||
| 		} | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
							
								
								
									
										10
									
								
								vendor/github.com/google/go-cmp/cmp/options.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/google/go-cmp/cmp/options.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -33,6 +33,7 @@ type Option interface { | ||||
| } | ||||
|  | ||||
| // applicableOption represents the following types: | ||||
| // | ||||
| //	Fundamental: ignore | validator | *comparer | *transformer | ||||
| //	Grouping:    Options | ||||
| type applicableOption interface { | ||||
| @@ -43,6 +44,7 @@ type applicableOption interface { | ||||
| } | ||||
|  | ||||
| // coreOption represents the following types: | ||||
| // | ||||
| //	Fundamental: ignore | validator | *comparer | *transformer | ||||
| //	Filters:     *pathFilter | *valuesFilter | ||||
| type coreOption interface { | ||||
| @@ -336,9 +338,9 @@ func (tr transformer) String() string { | ||||
| // both implement T. | ||||
| // | ||||
| // The equality function must be: | ||||
| //	• Symmetric: equal(x, y) == equal(y, x) | ||||
| //	• Deterministic: equal(x, y) == equal(x, y) | ||||
| //	• Pure: equal(x, y) does not modify x or y | ||||
| //   - Symmetric: equal(x, y) == equal(y, x) | ||||
| //   - Deterministic: equal(x, y) == equal(x, y) | ||||
| //   - Pure: equal(x, y) does not modify x or y | ||||
| func Comparer(f interface{}) Option { | ||||
| 	v := reflect.ValueOf(f) | ||||
| 	if !function.IsType(v.Type(), function.Equal) || v.IsNil() { | ||||
| @@ -430,7 +432,7 @@ func AllowUnexported(types ...interface{}) Option { | ||||
| } | ||||
|  | ||||
| // Result represents the comparison result for a single node and | ||||
| // is provided by cmp when calling Result (see Reporter). | ||||
| // is provided by cmp when calling Report (see Reporter). | ||||
| type Result struct { | ||||
| 	_     [0]func() // Make Result incomparable | ||||
| 	flags resultFlags | ||||
|   | ||||
							
								
								
									
										20
									
								
								vendor/github.com/google/go-cmp/cmp/path.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/google/go-cmp/cmp/path.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -41,13 +41,13 @@ type PathStep interface { | ||||
| 	// The type of each valid value is guaranteed to be identical to Type. | ||||
| 	// | ||||
| 	// In some cases, one or both may be invalid or have restrictions: | ||||
| 	//	• For StructField, both are not interface-able if the current field | ||||
| 	//	is unexported and the struct type is not explicitly permitted by | ||||
| 	//	an Exporter to traverse unexported fields. | ||||
| 	//	• For SliceIndex, one may be invalid if an element is missing from | ||||
| 	//	either the x or y slice. | ||||
| 	//	• For MapIndex, one may be invalid if an entry is missing from | ||||
| 	//	either the x or y map. | ||||
| 	//   - For StructField, both are not interface-able if the current field | ||||
| 	//     is unexported and the struct type is not explicitly permitted by | ||||
| 	//     an Exporter to traverse unexported fields. | ||||
| 	//   - For SliceIndex, one may be invalid if an element is missing from | ||||
| 	//     either the x or y slice. | ||||
| 	//   - For MapIndex, one may be invalid if an entry is missing from | ||||
| 	//     either the x or y map. | ||||
| 	// | ||||
| 	// The provided values must not be mutated. | ||||
| 	Values() (vx, vy reflect.Value) | ||||
| @@ -94,6 +94,7 @@ func (pa Path) Index(i int) PathStep { | ||||
| // The simplified path only contains struct field accesses. | ||||
| // | ||||
| // For example: | ||||
| // | ||||
| //	MyMap.MySlices.MyField | ||||
| func (pa Path) String() string { | ||||
| 	var ss []string | ||||
| @@ -108,6 +109,7 @@ func (pa Path) String() string { | ||||
| // GoString returns the path to a specific node using Go syntax. | ||||
| // | ||||
| // For example: | ||||
| // | ||||
| //	(*root.MyMap["key"].(*mypkg.MyStruct).MySlices)[2][3].MyField | ||||
| func (pa Path) GoString() string { | ||||
| 	var ssPre, ssPost []string | ||||
| @@ -159,7 +161,7 @@ func (ps pathStep) String() string { | ||||
| 	if ps.typ == nil { | ||||
| 		return "<nil>" | ||||
| 	} | ||||
| 	s := ps.typ.String() | ||||
| 	s := value.TypeString(ps.typ, false) | ||||
| 	if s == "" || strings.ContainsAny(s, "{}\n") { | ||||
| 		return "root" // Type too simple or complex to print | ||||
| 	} | ||||
| @@ -282,7 +284,7 @@ type typeAssertion struct { | ||||
|  | ||||
| func (ta TypeAssertion) Type() reflect.Type             { return ta.typ } | ||||
| func (ta TypeAssertion) Values() (vx, vy reflect.Value) { return ta.vx, ta.vy } | ||||
| func (ta TypeAssertion) String() string                 { return fmt.Sprintf(".(%v)", ta.typ) } | ||||
| func (ta TypeAssertion) String() string                 { return fmt.Sprintf(".(%v)", value.TypeString(ta.typ, false)) } | ||||
|  | ||||
| // Transform is a transformation from the parent type to the current type. | ||||
| type Transform struct{ *transform } | ||||
|   | ||||
							
								
								
									
										10
									
								
								vendor/github.com/google/go-cmp/cmp/report_compare.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/google/go-cmp/cmp/report_compare.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -7,8 +7,6 @@ package cmp | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
|  | ||||
| 	"github.com/google/go-cmp/cmp/internal/value" | ||||
| ) | ||||
|  | ||||
| // numContextRecords is the number of surrounding equal records to print. | ||||
| @@ -117,7 +115,7 @@ func (opts formatOptions) FormatDiff(v *valueNode, ptrs *pointerReferences) (out | ||||
|  | ||||
| 	// For leaf nodes, format the value based on the reflect.Values alone. | ||||
| 	// As a special case, treat equal []byte as a leaf nodes. | ||||
| 	isBytes := v.Type.Kind() == reflect.Slice && v.Type.Elem() == reflect.TypeOf(byte(0)) | ||||
| 	isBytes := v.Type.Kind() == reflect.Slice && v.Type.Elem() == byteType | ||||
| 	isEqualBytes := isBytes && v.NumDiff+v.NumIgnored+v.NumTransformed == 0 | ||||
| 	if v.MaxDepth == 0 || isEqualBytes { | ||||
| 		switch opts.DiffMode { | ||||
| @@ -248,11 +246,11 @@ func (opts formatOptions) formatDiffList(recs []reportRecord, k reflect.Kind, pt | ||||
| 				var isZero bool | ||||
| 				switch opts.DiffMode { | ||||
| 				case diffIdentical: | ||||
| 					isZero = value.IsZero(r.Value.ValueX) || value.IsZero(r.Value.ValueY) | ||||
| 					isZero = r.Value.ValueX.IsZero() || r.Value.ValueY.IsZero() | ||||
| 				case diffRemoved: | ||||
| 					isZero = value.IsZero(r.Value.ValueX) | ||||
| 					isZero = r.Value.ValueX.IsZero() | ||||
| 				case diffInserted: | ||||
| 					isZero = value.IsZero(r.Value.ValueY) | ||||
| 					isZero = r.Value.ValueY.IsZero() | ||||
| 				} | ||||
| 				if isZero { | ||||
| 					continue | ||||
|   | ||||
							
								
								
									
										11
									
								
								vendor/github.com/google/go-cmp/cmp/report_reflect.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/google/go-cmp/cmp/report_reflect.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -16,6 +16,13 @@ import ( | ||||
| 	"github.com/google/go-cmp/cmp/internal/value" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	anyType    = reflect.TypeOf((*interface{})(nil)).Elem() | ||||
| 	stringType = reflect.TypeOf((*string)(nil)).Elem() | ||||
| 	bytesType  = reflect.TypeOf((*[]byte)(nil)).Elem() | ||||
| 	byteType   = reflect.TypeOf((*byte)(nil)).Elem() | ||||
| ) | ||||
|  | ||||
| type formatValueOptions struct { | ||||
| 	// AvoidStringer controls whether to avoid calling custom stringer | ||||
| 	// methods like error.Error or fmt.Stringer.String. | ||||
| @@ -184,7 +191,7 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind, | ||||
| 		} | ||||
| 		for i := 0; i < v.NumField(); i++ { | ||||
| 			vv := v.Field(i) | ||||
| 			if value.IsZero(vv) { | ||||
| 			if vv.IsZero() { | ||||
| 				continue // Elide fields with zero values | ||||
| 			} | ||||
| 			if len(list) == maxLen { | ||||
| @@ -205,7 +212,7 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind, | ||||
| 		} | ||||
|  | ||||
| 		// Check whether this is a []byte of text data. | ||||
| 		if t.Elem() == reflect.TypeOf(byte(0)) { | ||||
| 		if t.Elem() == byteType { | ||||
| 			b := v.Bytes() | ||||
| 			isPrintSpace := func(r rune) bool { return unicode.IsPrint(r) || unicode.IsSpace(r) } | ||||
| 			if len(b) > 0 && utf8.Valid(b) && len(bytes.TrimFunc(b, isPrintSpace)) == 0 { | ||||
|   | ||||
							
								
								
									
										25
									
								
								vendor/github.com/google/go-cmp/cmp/report_slices.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/google/go-cmp/cmp/report_slices.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -104,7 +104,7 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { | ||||
| 	case t.Kind() == reflect.String: | ||||
| 		sx, sy = vx.String(), vy.String() | ||||
| 		isString = true | ||||
| 	case t.Kind() == reflect.Slice && t.Elem() == reflect.TypeOf(byte(0)): | ||||
| 	case t.Kind() == reflect.Slice && t.Elem() == byteType: | ||||
| 		sx, sy = string(vx.Bytes()), string(vy.Bytes()) | ||||
| 		isString = true | ||||
| 	case t.Kind() == reflect.Array: | ||||
| @@ -147,7 +147,10 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { | ||||
| 			}) | ||||
| 			efficiencyLines := float64(esLines.Dist()) / float64(len(esLines)) | ||||
| 			efficiencyBytes := float64(esBytes.Dist()) / float64(len(esBytes)) | ||||
| 			isPureLinedText = efficiencyLines < 4*efficiencyBytes | ||||
| 			quotedLength := len(strconv.Quote(sx + sy)) | ||||
| 			unquotedLength := len(sx) + len(sy) | ||||
| 			escapeExpansionRatio := float64(quotedLength) / float64(unquotedLength) | ||||
| 			isPureLinedText = efficiencyLines < 4*efficiencyBytes || escapeExpansionRatio > 1.1 | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @@ -171,12 +174,13 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { | ||||
| 		// differences in a string literal. This format is more readable, | ||||
| 		// but has edge-cases where differences are visually indistinguishable. | ||||
| 		// This format is avoided under the following conditions: | ||||
| 		//	• A line starts with `"""` | ||||
| 		//	• A line starts with "..." | ||||
| 		//	• A line contains non-printable characters | ||||
| 		//	• Adjacent different lines differ only by whitespace | ||||
| 		//   - A line starts with `"""` | ||||
| 		//   - A line starts with "..." | ||||
| 		//   - A line contains non-printable characters | ||||
| 		//   - Adjacent different lines differ only by whitespace | ||||
| 		// | ||||
| 		// For example: | ||||
| 		// | ||||
| 		//		""" | ||||
| 		//		... // 3 identical lines | ||||
| 		//		foo | ||||
| @@ -231,7 +235,7 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { | ||||
| 			var out textNode = &textWrap{Prefix: "(", Value: list2, Suffix: ")"} | ||||
| 			switch t.Kind() { | ||||
| 			case reflect.String: | ||||
| 				if t != reflect.TypeOf(string("")) { | ||||
| 				if t != stringType { | ||||
| 					out = opts.FormatType(t, out) | ||||
| 				} | ||||
| 			case reflect.Slice: | ||||
| @@ -326,12 +330,12 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { | ||||
| 	switch t.Kind() { | ||||
| 	case reflect.String: | ||||
| 		out = &textWrap{Prefix: "strings.Join(", Value: out, Suffix: fmt.Sprintf(", %q)", delim)} | ||||
| 		if t != reflect.TypeOf(string("")) { | ||||
| 		if t != stringType { | ||||
| 			out = opts.FormatType(t, out) | ||||
| 		} | ||||
| 	case reflect.Slice: | ||||
| 		out = &textWrap{Prefix: "bytes.Join(", Value: out, Suffix: fmt.Sprintf(", %q)", delim)} | ||||
| 		if t != reflect.TypeOf([]byte(nil)) { | ||||
| 		if t != bytesType { | ||||
| 			out = opts.FormatType(t, out) | ||||
| 		} | ||||
| 	} | ||||
| @@ -446,7 +450,6 @@ func (opts formatOptions) formatDiffSlice( | ||||
| //		{NumIdentical: 3}, | ||||
| //		{NumInserted: 1}, | ||||
| //	] | ||||
| // | ||||
| func coalesceAdjacentEdits(name string, es diff.EditScript) (groups []diffStats) { | ||||
| 	var prevMode byte | ||||
| 	lastStats := func(mode byte) *diffStats { | ||||
| @@ -503,7 +506,6 @@ func coalesceAdjacentEdits(name string, es diff.EditScript) (groups []diffStats) | ||||
| //		{NumIdentical: 8, NumRemoved: 12, NumInserted: 3}, | ||||
| //		{NumIdentical: 63}, | ||||
| //	] | ||||
| // | ||||
| func coalesceInterveningIdentical(groups []diffStats, windowSize int) []diffStats { | ||||
| 	groups, groupsOrig := groups[:0], groups | ||||
| 	for i, ds := range groupsOrig { | ||||
| @@ -548,7 +550,6 @@ func coalesceInterveningIdentical(groups []diffStats, windowSize int) []diffStat | ||||
| //		{NumRemoved: 9}, | ||||
| //		{NumIdentical: 64}, // incremented by 10 | ||||
| //	] | ||||
| // | ||||
| func cleanupSurroundingIdentical(groups []diffStats, eq func(i, j int) bool) []diffStats { | ||||
| 	var ix, iy int // indexes into sequence x and y | ||||
| 	for i, ds := range groups { | ||||
|   | ||||
							
								
								
									
										1
									
								
								vendor/github.com/google/go-cmp/cmp/report_text.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/google/go-cmp/cmp/report_text.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -393,6 +393,7 @@ func (s diffStats) Append(ds diffStats) diffStats { | ||||
| // String prints a humanly-readable summary of coalesced records. | ||||
| // | ||||
| // Example: | ||||
| // | ||||
| //	diffStats{Name: "Field", NumIgnored: 5}.String() => "5 ignored fields" | ||||
| func (s diffStats) String() string { | ||||
| 	var ss []string | ||||
|   | ||||
							
								
								
									
										202
									
								
								vendor/github.com/kylelemons/godebug/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										202
									
								
								vendor/github.com/kylelemons/godebug/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,202 +0,0 @@ | ||||
|  | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
							
								
								
									
										186
									
								
								vendor/github.com/kylelemons/godebug/diff/diff.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										186
									
								
								vendor/github.com/kylelemons/godebug/diff/diff.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,186 +0,0 @@ | ||||
| // Copyright 2013 Google Inc.  All rights reserved. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| // Package diff implements a linewise diff algorithm. | ||||
| package diff | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // Chunk represents a piece of the diff.  A chunk will not have both added and | ||||
| // deleted lines.  Equal lines are always after any added or deleted lines. | ||||
| // A Chunk may or may not have any lines in it, especially for the first or last | ||||
| // chunk in a computation. | ||||
| type Chunk struct { | ||||
| 	Added   []string | ||||
| 	Deleted []string | ||||
| 	Equal   []string | ||||
| } | ||||
|  | ||||
| func (c *Chunk) empty() bool { | ||||
| 	return len(c.Added) == 0 && len(c.Deleted) == 0 && len(c.Equal) == 0 | ||||
| } | ||||
|  | ||||
| // Diff returns a string containing a line-by-line unified diff of the linewise | ||||
| // changes required to make A into B.  Each line is prefixed with '+', '-', or | ||||
| // ' ' to indicate if it should be added, removed, or is correct respectively. | ||||
| func Diff(A, B string) string { | ||||
| 	aLines := strings.Split(A, "\n") | ||||
| 	bLines := strings.Split(B, "\n") | ||||
|  | ||||
| 	chunks := DiffChunks(aLines, bLines) | ||||
|  | ||||
| 	buf := new(bytes.Buffer) | ||||
| 	for _, c := range chunks { | ||||
| 		for _, line := range c.Added { | ||||
| 			fmt.Fprintf(buf, "+%s\n", line) | ||||
| 		} | ||||
| 		for _, line := range c.Deleted { | ||||
| 			fmt.Fprintf(buf, "-%s\n", line) | ||||
| 		} | ||||
| 		for _, line := range c.Equal { | ||||
| 			fmt.Fprintf(buf, " %s\n", line) | ||||
| 		} | ||||
| 	} | ||||
| 	return strings.TrimRight(buf.String(), "\n") | ||||
| } | ||||
|  | ||||
| // DiffChunks uses an O(D(N+M)) shortest-edit-script algorithm | ||||
| // to compute the edits required from A to B and returns the | ||||
| // edit chunks. | ||||
| func DiffChunks(a, b []string) []Chunk { | ||||
| 	// algorithm: http://www.xmailserver.org/diff2.pdf | ||||
|  | ||||
| 	// We'll need these quantities a lot. | ||||
| 	alen, blen := len(a), len(b) // M, N | ||||
|  | ||||
| 	// At most, it will require len(a) deletions and len(b) additions | ||||
| 	// to transform a into b. | ||||
| 	maxPath := alen + blen // MAX | ||||
| 	if maxPath == 0 { | ||||
| 		// degenerate case: two empty lists are the same | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// Store the endpoint of the path for diagonals. | ||||
| 	// We store only the a index, because the b index on any diagonal | ||||
| 	// (which we know during the loop below) is aidx-diag. | ||||
| 	// endpoint[maxPath] represents the 0 diagonal. | ||||
| 	// | ||||
| 	// Stated differently: | ||||
| 	// endpoint[d] contains the aidx of a furthest reaching path in diagonal d | ||||
| 	endpoint := make([]int, 2*maxPath+1) // V | ||||
|  | ||||
| 	saved := make([][]int, 0, 8) // Vs | ||||
| 	save := func() { | ||||
| 		dup := make([]int, len(endpoint)) | ||||
| 		copy(dup, endpoint) | ||||
| 		saved = append(saved, dup) | ||||
| 	} | ||||
|  | ||||
| 	var editDistance int // D | ||||
| dLoop: | ||||
| 	for editDistance = 0; editDistance <= maxPath; editDistance++ { | ||||
| 		// The 0 diag(onal) represents equality of a and b.  Each diagonal to | ||||
| 		// the left is numbered one lower, to the right is one higher, from | ||||
| 		// -alen to +blen.  Negative diagonals favor differences from a, | ||||
| 		// positive diagonals favor differences from b.  The edit distance to a | ||||
| 		// diagonal d cannot be shorter than d itself. | ||||
| 		// | ||||
| 		// The iterations of this loop cover either odds or evens, but not both, | ||||
| 		// If odd indices are inputs, even indices are outputs and vice versa. | ||||
| 		for diag := -editDistance; diag <= editDistance; diag += 2 { // k | ||||
| 			var aidx int // x | ||||
| 			switch { | ||||
| 			case diag == -editDistance: | ||||
| 				// This is a new diagonal; copy from previous iter | ||||
| 				aidx = endpoint[maxPath-editDistance+1] + 0 | ||||
| 			case diag == editDistance: | ||||
| 				// This is a new diagonal; copy from previous iter | ||||
| 				aidx = endpoint[maxPath+editDistance-1] + 1 | ||||
| 			case endpoint[maxPath+diag+1] > endpoint[maxPath+diag-1]: | ||||
| 				// diagonal d+1 was farther along, so use that | ||||
| 				aidx = endpoint[maxPath+diag+1] + 0 | ||||
| 			default: | ||||
| 				// diagonal d-1 was farther (or the same), so use that | ||||
| 				aidx = endpoint[maxPath+diag-1] + 1 | ||||
| 			} | ||||
| 			// On diagonal d, we can compute bidx from aidx. | ||||
| 			bidx := aidx - diag // y | ||||
| 			// See how far we can go on this diagonal before we find a difference. | ||||
| 			for aidx < alen && bidx < blen && a[aidx] == b[bidx] { | ||||
| 				aidx++ | ||||
| 				bidx++ | ||||
| 			} | ||||
| 			// Store the end of the current edit chain. | ||||
| 			endpoint[maxPath+diag] = aidx | ||||
| 			// If we've found the end of both inputs, we're done! | ||||
| 			if aidx >= alen && bidx >= blen { | ||||
| 				save() // save the final path | ||||
| 				break dLoop | ||||
| 			} | ||||
| 		} | ||||
| 		save() // save the current path | ||||
| 	} | ||||
| 	if editDistance == 0 { | ||||
| 		return nil | ||||
| 	} | ||||
| 	chunks := make([]Chunk, editDistance+1) | ||||
|  | ||||
| 	x, y := alen, blen | ||||
| 	for d := editDistance; d > 0; d-- { | ||||
| 		endpoint := saved[d] | ||||
| 		diag := x - y | ||||
| 		insert := diag == -d || (diag != d && endpoint[maxPath+diag-1] < endpoint[maxPath+diag+1]) | ||||
|  | ||||
| 		x1 := endpoint[maxPath+diag] | ||||
| 		var x0, xM, kk int | ||||
| 		if insert { | ||||
| 			kk = diag + 1 | ||||
| 			x0 = endpoint[maxPath+kk] | ||||
| 			xM = x0 | ||||
| 		} else { | ||||
| 			kk = diag - 1 | ||||
| 			x0 = endpoint[maxPath+kk] | ||||
| 			xM = x0 + 1 | ||||
| 		} | ||||
| 		y0 := x0 - kk | ||||
|  | ||||
| 		var c Chunk | ||||
| 		if insert { | ||||
| 			c.Added = b[y0:][:1] | ||||
| 		} else { | ||||
| 			c.Deleted = a[x0:][:1] | ||||
| 		} | ||||
| 		if xM < x1 { | ||||
| 			c.Equal = a[xM:][:x1-xM] | ||||
| 		} | ||||
|  | ||||
| 		x, y = x0, y0 | ||||
| 		chunks[d] = c | ||||
| 	} | ||||
| 	if x > 0 { | ||||
| 		chunks[0].Equal = a[:x] | ||||
| 	} | ||||
| 	if chunks[0].empty() { | ||||
| 		chunks = chunks[1:] | ||||
| 	} | ||||
| 	if len(chunks) == 0 { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return chunks | ||||
| } | ||||
							
								
								
									
										5
									
								
								vendor/github.com/kylelemons/godebug/pretty/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/kylelemons/godebug/pretty/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,5 +0,0 @@ | ||||
| *.test | ||||
| *.bench | ||||
| *.golden | ||||
| *.txt | ||||
| *.prof | ||||
							
								
								
									
										25
									
								
								vendor/github.com/kylelemons/godebug/pretty/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/kylelemons/godebug/pretty/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,25 +0,0 @@ | ||||
| // Copyright 2013 Google Inc.  All rights reserved. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| // Package pretty pretty-prints Go structures. | ||||
| // | ||||
| // This package uses reflection to examine a Go value and can | ||||
| // print out in a nice, aligned fashion.  It supports three | ||||
| // modes (normal, compact, and extended) for advanced use. | ||||
| // | ||||
| // See the Reflect and Print examples for what the output looks like. | ||||
| package pretty | ||||
|  | ||||
| // TODO: | ||||
| //   - Catch cycles | ||||
							
								
								
									
										188
									
								
								vendor/github.com/kylelemons/godebug/pretty/public.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										188
									
								
								vendor/github.com/kylelemons/godebug/pretty/public.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,188 +0,0 @@ | ||||
| // Copyright 2013 Google Inc.  All rights reserved. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package pretty | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"net" | ||||
| 	"reflect" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/kylelemons/godebug/diff" | ||||
| ) | ||||
|  | ||||
| // A Config represents optional configuration parameters for formatting. | ||||
| // | ||||
| // Some options, notably ShortList, dramatically increase the overhead | ||||
| // of pretty-printing a value. | ||||
| type Config struct { | ||||
| 	// Verbosity options | ||||
| 	Compact  bool // One-line output. Overrides Diffable. | ||||
| 	Diffable bool // Adds extra newlines for more easily diffable output. | ||||
|  | ||||
| 	// Field and value options | ||||
| 	IncludeUnexported   bool // Include unexported fields in output | ||||
| 	PrintStringers      bool // Call String on a fmt.Stringer | ||||
| 	PrintTextMarshalers bool // Call MarshalText on an encoding.TextMarshaler | ||||
| 	SkipZeroFields      bool // Skip struct fields that have a zero value. | ||||
|  | ||||
| 	// Output transforms | ||||
| 	ShortList int // Maximum character length for short lists if nonzero. | ||||
|  | ||||
| 	// Type-specific overrides | ||||
| 	// | ||||
| 	// Formatter maps a type to a function that will provide a one-line string | ||||
| 	// representation of the input value.  Conceptually: | ||||
| 	//   Formatter[reflect.TypeOf(v)](v) = "v as a string" | ||||
| 	// | ||||
| 	// Note that the first argument need not explicitly match the type, it must | ||||
| 	// merely be callable with it. | ||||
| 	// | ||||
| 	// When processing an input value, if its type exists as a key in Formatter: | ||||
| 	//   1) If the value is nil, no stringification is performed. | ||||
| 	//      This allows overriding of PrintStringers and PrintTextMarshalers. | ||||
| 	//   2) The value will be called with the input as its only argument. | ||||
| 	//      The function must return a string as its first return value. | ||||
| 	// | ||||
| 	// In addition to func literals, two common values for this will be: | ||||
| 	//   fmt.Sprint        (function) func Sprint(...interface{}) string | ||||
| 	//   Type.String         (method) func (Type) String() string | ||||
| 	// | ||||
| 	// Note that neither of these work if the String method is a pointer | ||||
| 	// method and the input will be provided as a value.  In that case, | ||||
| 	// use a function that calls .String on the formal value parameter. | ||||
| 	Formatter map[reflect.Type]interface{} | ||||
|  | ||||
| 	// If TrackCycles is enabled, pretty will detect and track | ||||
| 	// self-referential structures. If a self-referential structure (aka a | ||||
| 	// "recursive" value) is detected, numbered placeholders will be emitted. | ||||
| 	// | ||||
| 	// Pointer tracking is disabled by default for performance reasons. | ||||
| 	TrackCycles bool | ||||
| } | ||||
|  | ||||
| // Default Config objects | ||||
| var ( | ||||
| 	// DefaultFormatter is the default set of overrides for stringification. | ||||
| 	DefaultFormatter = map[reflect.Type]interface{}{ | ||||
| 		reflect.TypeOf(time.Time{}):          fmt.Sprint, | ||||
| 		reflect.TypeOf(net.IP{}):             fmt.Sprint, | ||||
| 		reflect.TypeOf((*error)(nil)).Elem(): fmt.Sprint, | ||||
| 	} | ||||
|  | ||||
| 	// CompareConfig is the default configuration used for Compare. | ||||
| 	CompareConfig = &Config{ | ||||
| 		Diffable:          true, | ||||
| 		IncludeUnexported: true, | ||||
| 		Formatter:         DefaultFormatter, | ||||
| 	} | ||||
|  | ||||
| 	// DefaultConfig is the default configuration used for all other top-level functions. | ||||
| 	DefaultConfig = &Config{ | ||||
| 		Formatter: DefaultFormatter, | ||||
| 	} | ||||
|  | ||||
| 	// CycleTracker is a convenience config for formatting and comparing recursive structures. | ||||
| 	CycleTracker = &Config{ | ||||
| 		Diffable:    true, | ||||
| 		Formatter:   DefaultFormatter, | ||||
| 		TrackCycles: true, | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func (cfg *Config) fprint(buf *bytes.Buffer, vals ...interface{}) { | ||||
| 	ref := &reflector{ | ||||
| 		Config: cfg, | ||||
| 	} | ||||
| 	if cfg.TrackCycles { | ||||
| 		ref.pointerTracker = new(pointerTracker) | ||||
| 	} | ||||
| 	for i, val := range vals { | ||||
| 		if i > 0 { | ||||
| 			buf.WriteByte('\n') | ||||
| 		} | ||||
| 		newFormatter(cfg, buf).write(ref.val2node(reflect.ValueOf(val))) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Print writes the DefaultConfig representation of the given values to standard output. | ||||
| func Print(vals ...interface{}) { | ||||
| 	DefaultConfig.Print(vals...) | ||||
| } | ||||
|  | ||||
| // Print writes the configured presentation of the given values to standard output. | ||||
| func (cfg *Config) Print(vals ...interface{}) { | ||||
| 	fmt.Println(cfg.Sprint(vals...)) | ||||
| } | ||||
|  | ||||
| // Sprint returns a string representation of the given value according to the DefaultConfig. | ||||
| func Sprint(vals ...interface{}) string { | ||||
| 	return DefaultConfig.Sprint(vals...) | ||||
| } | ||||
|  | ||||
| // Sprint returns a string representation of the given value according to cfg. | ||||
| func (cfg *Config) Sprint(vals ...interface{}) string { | ||||
| 	buf := new(bytes.Buffer) | ||||
| 	cfg.fprint(buf, vals...) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| // Fprint writes the representation of the given value to the writer according to the DefaultConfig. | ||||
| func Fprint(w io.Writer, vals ...interface{}) (n int64, err error) { | ||||
| 	return DefaultConfig.Fprint(w, vals...) | ||||
| } | ||||
|  | ||||
| // Fprint writes the representation of the given value to the writer according to the cfg. | ||||
| func (cfg *Config) Fprint(w io.Writer, vals ...interface{}) (n int64, err error) { | ||||
| 	buf := new(bytes.Buffer) | ||||
| 	cfg.fprint(buf, vals...) | ||||
| 	return buf.WriteTo(w) | ||||
| } | ||||
|  | ||||
| // Compare returns a string containing a line-by-line unified diff of the | ||||
| // values in a and b, using the CompareConfig. | ||||
| // | ||||
| // Each line in the output is prefixed with '+', '-', or ' ' to indicate which | ||||
| // side it's from. Lines from the a side are marked with '-', lines from the | ||||
| // b side are marked with '+' and lines that are the same on both sides are | ||||
| // marked with ' '. | ||||
| // | ||||
| // The comparison is based on the intentionally-untyped output of Print, and as | ||||
| // such this comparison is pretty forviving.  In particular, if the types of or | ||||
| // types within in a and b are different but have the same representation, | ||||
| // Compare will not indicate any differences between them. | ||||
| func Compare(a, b interface{}) string { | ||||
| 	return CompareConfig.Compare(a, b) | ||||
| } | ||||
|  | ||||
| // Compare returns a string containing a line-by-line unified diff of the | ||||
| // values in got and want according to the cfg. | ||||
| // | ||||
| // Each line in the output is prefixed with '+', '-', or ' ' to indicate which | ||||
| // side it's from. Lines from the a side are marked with '-', lines from the | ||||
| // b side are marked with '+' and lines that are the same on both sides are | ||||
| // marked with ' '. | ||||
| // | ||||
| // The comparison is based on the intentionally-untyped output of Print, and as | ||||
| // such this comparison is pretty forviving.  In particular, if the types of or | ||||
| // types within in a and b are different but have the same representation, | ||||
| // Compare will not indicate any differences between them. | ||||
| func (cfg *Config) Compare(a, b interface{}) string { | ||||
| 	diffCfg := *cfg | ||||
| 	diffCfg.Diffable = true | ||||
| 	return diff.Diff(cfg.Sprint(a), cfg.Sprint(b)) | ||||
| } | ||||
							
								
								
									
										241
									
								
								vendor/github.com/kylelemons/godebug/pretty/reflect.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										241
									
								
								vendor/github.com/kylelemons/godebug/pretty/reflect.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,241 +0,0 @@ | ||||
| // Copyright 2013 Google Inc.  All rights reserved. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package pretty | ||||
|  | ||||
| import ( | ||||
| 	"encoding" | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"sort" | ||||
| ) | ||||
|  | ||||
| func isZeroVal(val reflect.Value) bool { | ||||
| 	if !val.CanInterface() { | ||||
| 		return false | ||||
| 	} | ||||
| 	z := reflect.Zero(val.Type()).Interface() | ||||
| 	return reflect.DeepEqual(val.Interface(), z) | ||||
| } | ||||
|  | ||||
| // pointerTracker is a helper for tracking pointer chasing to detect cycles. | ||||
| type pointerTracker struct { | ||||
| 	addrs map[uintptr]int // addr[address] = seen count | ||||
|  | ||||
| 	lastID int | ||||
| 	ids    map[uintptr]int // ids[address] = id | ||||
| } | ||||
|  | ||||
| // track tracks following a reference (pointer, slice, map, etc).  Every call to | ||||
| // track should be paired with a call to untrack. | ||||
| func (p *pointerTracker) track(ptr uintptr) { | ||||
| 	if p.addrs == nil { | ||||
| 		p.addrs = make(map[uintptr]int) | ||||
| 	} | ||||
| 	p.addrs[ptr]++ | ||||
| } | ||||
|  | ||||
| // untrack registers that we have backtracked over the reference to the pointer. | ||||
| func (p *pointerTracker) untrack(ptr uintptr) { | ||||
| 	p.addrs[ptr]-- | ||||
| 	if p.addrs[ptr] == 0 { | ||||
| 		delete(p.addrs, ptr) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // seen returns whether the pointer was previously seen along this path. | ||||
| func (p *pointerTracker) seen(ptr uintptr) bool { | ||||
| 	_, ok := p.addrs[ptr] | ||||
| 	return ok | ||||
| } | ||||
|  | ||||
| // keep allocates an ID for the given address and returns it. | ||||
| func (p *pointerTracker) keep(ptr uintptr) int { | ||||
| 	if p.ids == nil { | ||||
| 		p.ids = make(map[uintptr]int) | ||||
| 	} | ||||
| 	if _, ok := p.ids[ptr]; !ok { | ||||
| 		p.lastID++ | ||||
| 		p.ids[ptr] = p.lastID | ||||
| 	} | ||||
| 	return p.ids[ptr] | ||||
| } | ||||
|  | ||||
| // id returns the ID for the given address. | ||||
| func (p *pointerTracker) id(ptr uintptr) (int, bool) { | ||||
| 	if p.ids == nil { | ||||
| 		p.ids = make(map[uintptr]int) | ||||
| 	} | ||||
| 	id, ok := p.ids[ptr] | ||||
| 	return id, ok | ||||
| } | ||||
|  | ||||
| // reflector adds local state to the recursive reflection logic. | ||||
| type reflector struct { | ||||
| 	*Config | ||||
| 	*pointerTracker | ||||
| } | ||||
|  | ||||
| // follow handles following a possiblly-recursive reference to the given value | ||||
| // from the given ptr address. | ||||
| func (r *reflector) follow(ptr uintptr, val reflect.Value) node { | ||||
| 	if r.pointerTracker == nil { | ||||
| 		// Tracking disabled | ||||
| 		return r.val2node(val) | ||||
| 	} | ||||
|  | ||||
| 	// If a parent already followed this, emit a reference marker | ||||
| 	if r.seen(ptr) { | ||||
| 		id := r.keep(ptr) | ||||
| 		return ref{id} | ||||
| 	} | ||||
|  | ||||
| 	// Track the pointer we're following while on this recursive branch | ||||
| 	r.track(ptr) | ||||
| 	defer r.untrack(ptr) | ||||
| 	n := r.val2node(val) | ||||
|  | ||||
| 	// If the recursion used this ptr, wrap it with a target marker | ||||
| 	if id, ok := r.id(ptr); ok { | ||||
| 		return target{id, n} | ||||
| 	} | ||||
|  | ||||
| 	// Otherwise, return the node unadulterated | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func (r *reflector) val2node(val reflect.Value) node { | ||||
| 	if !val.IsValid() { | ||||
| 		return rawVal("nil") | ||||
| 	} | ||||
|  | ||||
| 	if val.CanInterface() { | ||||
| 		v := val.Interface() | ||||
| 		if formatter, ok := r.Formatter[val.Type()]; ok { | ||||
| 			if formatter != nil { | ||||
| 				res := reflect.ValueOf(formatter).Call([]reflect.Value{val}) | ||||
| 				return rawVal(res[0].Interface().(string)) | ||||
| 			} | ||||
| 		} else { | ||||
| 			if s, ok := v.(fmt.Stringer); ok && r.PrintStringers { | ||||
| 				return stringVal(s.String()) | ||||
| 			} | ||||
| 			if t, ok := v.(encoding.TextMarshaler); ok && r.PrintTextMarshalers { | ||||
| 				if raw, err := t.MarshalText(); err == nil { // if NOT an error | ||||
| 					return stringVal(string(raw)) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	switch kind := val.Kind(); kind { | ||||
| 	case reflect.Ptr: | ||||
| 		if val.IsNil() { | ||||
| 			return rawVal("nil") | ||||
| 		} | ||||
| 		return r.follow(val.Pointer(), val.Elem()) | ||||
| 	case reflect.Interface: | ||||
| 		if val.IsNil() { | ||||
| 			return rawVal("nil") | ||||
| 		} | ||||
| 		return r.val2node(val.Elem()) | ||||
| 	case reflect.String: | ||||
| 		return stringVal(val.String()) | ||||
| 	case reflect.Slice: | ||||
| 		n := list{} | ||||
| 		length := val.Len() | ||||
| 		ptr := val.Pointer() | ||||
| 		for i := 0; i < length; i++ { | ||||
| 			n = append(n, r.follow(ptr, val.Index(i))) | ||||
| 		} | ||||
| 		return n | ||||
| 	case reflect.Array: | ||||
| 		n := list{} | ||||
| 		length := val.Len() | ||||
| 		for i := 0; i < length; i++ { | ||||
| 			n = append(n, r.val2node(val.Index(i))) | ||||
| 		} | ||||
| 		return n | ||||
| 	case reflect.Map: | ||||
| 		// Extract the keys and sort them for stable iteration | ||||
| 		keys := val.MapKeys() | ||||
| 		pairs := make([]mapPair, 0, len(keys)) | ||||
| 		for _, key := range keys { | ||||
| 			pairs = append(pairs, mapPair{ | ||||
| 				key:   new(formatter).compactString(r.val2node(key)), // can't be cyclic | ||||
| 				value: val.MapIndex(key), | ||||
| 			}) | ||||
| 		} | ||||
| 		sort.Sort(byKey(pairs)) | ||||
|  | ||||
| 		// Process the keys into the final representation | ||||
| 		ptr, n := val.Pointer(), keyvals{} | ||||
| 		for _, pair := range pairs { | ||||
| 			n = append(n, keyval{ | ||||
| 				key: pair.key, | ||||
| 				val: r.follow(ptr, pair.value), | ||||
| 			}) | ||||
| 		} | ||||
| 		return n | ||||
| 	case reflect.Struct: | ||||
| 		n := keyvals{} | ||||
| 		typ := val.Type() | ||||
| 		fields := typ.NumField() | ||||
| 		for i := 0; i < fields; i++ { | ||||
| 			sf := typ.Field(i) | ||||
| 			if !r.IncludeUnexported && sf.PkgPath != "" { | ||||
| 				continue | ||||
| 			} | ||||
| 			field := val.Field(i) | ||||
| 			if r.SkipZeroFields && isZeroVal(field) { | ||||
| 				continue | ||||
| 			} | ||||
| 			n = append(n, keyval{sf.Name, r.val2node(field)}) | ||||
| 		} | ||||
| 		return n | ||||
| 	case reflect.Bool: | ||||
| 		if val.Bool() { | ||||
| 			return rawVal("true") | ||||
| 		} | ||||
| 		return rawVal("false") | ||||
| 	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: | ||||
| 		return rawVal(fmt.Sprintf("%d", val.Int())) | ||||
| 	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: | ||||
| 		return rawVal(fmt.Sprintf("%d", val.Uint())) | ||||
| 	case reflect.Uintptr: | ||||
| 		return rawVal(fmt.Sprintf("0x%X", val.Uint())) | ||||
| 	case reflect.Float32, reflect.Float64: | ||||
| 		return rawVal(fmt.Sprintf("%v", val.Float())) | ||||
| 	case reflect.Complex64, reflect.Complex128: | ||||
| 		return rawVal(fmt.Sprintf("%v", val.Complex())) | ||||
| 	} | ||||
|  | ||||
| 	// Fall back to the default %#v if we can | ||||
| 	if val.CanInterface() { | ||||
| 		return rawVal(fmt.Sprintf("%#v", val.Interface())) | ||||
| 	} | ||||
|  | ||||
| 	return rawVal(val.String()) | ||||
| } | ||||
|  | ||||
| type mapPair struct { | ||||
| 	key   string | ||||
| 	value reflect.Value | ||||
| } | ||||
|  | ||||
| type byKey []mapPair | ||||
|  | ||||
| func (v byKey) Len() int           { return len(v) } | ||||
| func (v byKey) Swap(i, j int)      { v[i], v[j] = v[j], v[i] } | ||||
| func (v byKey) Less(i, j int) bool { return v[i].key < v[j].key } | ||||
							
								
								
									
										223
									
								
								vendor/github.com/kylelemons/godebug/pretty/structure.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										223
									
								
								vendor/github.com/kylelemons/godebug/pretty/structure.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,223 +0,0 @@ | ||||
| // Copyright 2013 Google Inc.  All rights reserved. | ||||
| // | ||||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| // you may not use this file except in compliance with the License. | ||||
| // You may obtain a copy of the License at | ||||
| // | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| // | ||||
| // Unless required by applicable law or agreed to in writing, software | ||||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package pretty | ||||
|  | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // a formatter stores stateful formatting information as well as being | ||||
| // an io.Writer for simplicity. | ||||
| type formatter struct { | ||||
| 	*bufio.Writer | ||||
| 	*Config | ||||
|  | ||||
| 	// Self-referential structure tracking | ||||
| 	tagNumbers map[int]int // tagNumbers[id] = <#n> | ||||
| } | ||||
|  | ||||
| // newFormatter creates a new buffered formatter.  For the output to be written | ||||
| // to the given writer, this must be accompanied by a call to write (or Flush). | ||||
| func newFormatter(cfg *Config, w io.Writer) *formatter { | ||||
| 	return &formatter{ | ||||
| 		Writer:     bufio.NewWriter(w), | ||||
| 		Config:     cfg, | ||||
| 		tagNumbers: make(map[int]int), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (f *formatter) write(n node) { | ||||
| 	defer f.Flush() | ||||
| 	n.format(f, "") | ||||
| } | ||||
|  | ||||
| func (f *formatter) tagFor(id int) int { | ||||
| 	if tag, ok := f.tagNumbers[id]; ok { | ||||
| 		return tag | ||||
| 	} | ||||
| 	if f.tagNumbers == nil { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	tag := len(f.tagNumbers) + 1 | ||||
| 	f.tagNumbers[id] = tag | ||||
| 	return tag | ||||
| } | ||||
|  | ||||
| type node interface { | ||||
| 	format(f *formatter, indent string) | ||||
| } | ||||
|  | ||||
| func (f *formatter) compactString(n node) string { | ||||
| 	switch k := n.(type) { | ||||
| 	case stringVal: | ||||
| 		return string(k) | ||||
| 	case rawVal: | ||||
| 		return string(k) | ||||
| 	} | ||||
|  | ||||
| 	buf := new(bytes.Buffer) | ||||
| 	f2 := newFormatter(&Config{Compact: true}, buf) | ||||
| 	f2.tagNumbers = f.tagNumbers // reuse tagNumbers just in case | ||||
| 	f2.write(n) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| type stringVal string | ||||
|  | ||||
| func (str stringVal) format(f *formatter, indent string) { | ||||
| 	f.WriteString(strconv.Quote(string(str))) | ||||
| } | ||||
|  | ||||
| type rawVal string | ||||
|  | ||||
| func (r rawVal) format(f *formatter, indent string) { | ||||
| 	f.WriteString(string(r)) | ||||
| } | ||||
|  | ||||
| type keyval struct { | ||||
| 	key string | ||||
| 	val node | ||||
| } | ||||
|  | ||||
| type keyvals []keyval | ||||
|  | ||||
| func (l keyvals) format(f *formatter, indent string) { | ||||
| 	f.WriteByte('{') | ||||
|  | ||||
| 	switch { | ||||
| 	case f.Compact: | ||||
| 		// All on one line: | ||||
| 		for i, kv := range l { | ||||
| 			if i > 0 { | ||||
| 				f.WriteByte(',') | ||||
| 			} | ||||
| 			f.WriteString(kv.key) | ||||
| 			f.WriteByte(':') | ||||
| 			kv.val.format(f, indent) | ||||
| 		} | ||||
| 	case f.Diffable: | ||||
| 		f.WriteByte('\n') | ||||
| 		inner := indent + " " | ||||
| 		// Each value gets its own line: | ||||
| 		for _, kv := range l { | ||||
| 			f.WriteString(inner) | ||||
| 			f.WriteString(kv.key) | ||||
| 			f.WriteString(": ") | ||||
| 			kv.val.format(f, inner) | ||||
| 			f.WriteString(",\n") | ||||
| 		} | ||||
| 		f.WriteString(indent) | ||||
| 	default: | ||||
| 		keyWidth := 0 | ||||
| 		for _, kv := range l { | ||||
| 			if kw := len(kv.key); kw > keyWidth { | ||||
| 				keyWidth = kw | ||||
| 			} | ||||
| 		} | ||||
| 		alignKey := indent + " " | ||||
| 		alignValue := strings.Repeat(" ", keyWidth) | ||||
| 		inner := alignKey + alignValue + "  " | ||||
| 		// First and last line shared with bracket: | ||||
| 		for i, kv := range l { | ||||
| 			if i > 0 { | ||||
| 				f.WriteString(",\n") | ||||
| 				f.WriteString(alignKey) | ||||
| 			} | ||||
| 			f.WriteString(kv.key) | ||||
| 			f.WriteString(": ") | ||||
| 			f.WriteString(alignValue[len(kv.key):]) | ||||
| 			kv.val.format(f, inner) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	f.WriteByte('}') | ||||
| } | ||||
|  | ||||
| type list []node | ||||
|  | ||||
| func (l list) format(f *formatter, indent string) { | ||||
| 	if max := f.ShortList; max > 0 { | ||||
| 		short := f.compactString(l) | ||||
| 		if len(short) <= max { | ||||
| 			f.WriteString(short) | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	f.WriteByte('[') | ||||
|  | ||||
| 	switch { | ||||
| 	case f.Compact: | ||||
| 		// All on one line: | ||||
| 		for i, v := range l { | ||||
| 			if i > 0 { | ||||
| 				f.WriteByte(',') | ||||
| 			} | ||||
| 			v.format(f, indent) | ||||
| 		} | ||||
| 	case f.Diffable: | ||||
| 		f.WriteByte('\n') | ||||
| 		inner := indent + " " | ||||
| 		// Each value gets its own line: | ||||
| 		for _, v := range l { | ||||
| 			f.WriteString(inner) | ||||
| 			v.format(f, inner) | ||||
| 			f.WriteString(",\n") | ||||
| 		} | ||||
| 		f.WriteString(indent) | ||||
| 	default: | ||||
| 		inner := indent + " " | ||||
| 		// First and last line shared with bracket: | ||||
| 		for i, v := range l { | ||||
| 			if i > 0 { | ||||
| 				f.WriteString(",\n") | ||||
| 				f.WriteString(inner) | ||||
| 			} | ||||
| 			v.format(f, inner) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	f.WriteByte(']') | ||||
| } | ||||
|  | ||||
| type ref struct { | ||||
| 	id int | ||||
| } | ||||
|  | ||||
| func (r ref) format(f *formatter, indent string) { | ||||
| 	fmt.Fprintf(f, "<see #%d>", f.tagFor(r.id)) | ||||
| } | ||||
|  | ||||
| type target struct { | ||||
| 	id    int | ||||
| 	value node | ||||
| } | ||||
|  | ||||
| func (t target) format(f *formatter, indent string) { | ||||
| 	tag := fmt.Sprintf("<#%d> ", f.tagFor(t.id)) | ||||
| 	switch { | ||||
| 	case f.Diffable, f.Compact: | ||||
| 		// no indent changes | ||||
| 	default: | ||||
| 		indent += strings.Repeat(" ", len(tag)) | ||||
| 	} | ||||
| 	f.WriteString(tag) | ||||
| 	t.value.format(f, indent) | ||||
| } | ||||
							
								
								
									
										7
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							| @@ -343,9 +343,10 @@ github.com/google/gnostic/extensions | ||||
| github.com/google/gnostic/jsonschema | ||||
| github.com/google/gnostic/openapiv2 | ||||
| github.com/google/gnostic/openapiv3 | ||||
| # github.com/google/go-cmp v0.5.8 | ||||
| # github.com/google/go-cmp v0.5.9 | ||||
| ## explicit; go 1.13 | ||||
| github.com/google/go-cmp/cmp | ||||
| github.com/google/go-cmp/cmp/cmpopts | ||||
| github.com/google/go-cmp/cmp/internal/diff | ||||
| github.com/google/go-cmp/cmp/internal/flags | ||||
| github.com/google/go-cmp/cmp/internal/function | ||||
| @@ -436,10 +437,6 @@ github.com/kubernetes-sigs/service-catalog/pkg/client/clientset_generated/client | ||||
| github.com/kubernetes-sigs/service-catalog/pkg/client/clientset_generated/clientset/typed/settings/v1alpha1 | ||||
| github.com/kubernetes-sigs/service-catalog/pkg/client/clientset_generated/clientset/typed/settings/v1alpha1/fake | ||||
| github.com/kubernetes-sigs/service-catalog/pkg/filter | ||||
| # github.com/kylelemons/godebug v1.1.0 | ||||
| ## explicit; go 1.11 | ||||
| github.com/kylelemons/godebug/diff | ||||
| github.com/kylelemons/godebug/pretty | ||||
| # github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de | ||||
| ## explicit | ||||
| github.com/liggitt/tabwriter | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Armel Soro
					Armel Soro