diff options
Diffstat (limited to 'internal/pathtree_test.go')
| -rw-r--r-- | internal/pathtree_test.go | 103 | 
1 files changed, 103 insertions, 0 deletions
| diff --git a/internal/pathtree_test.go b/internal/pathtree_test.go new file mode 100644 index 0000000..11f6848 --- /dev/null +++ b/internal/pathtree_test.go @@ -0,0 +1,103 @@ +package internal_test + +import ( +	"strconv" +	"testing" + +	"github.com/stretchr/testify/assert" +	"github.com/stretchr/testify/require" + +	"tildegit.org/tjp/gus/internal" +) + +func TestPathTree(t *testing.T) { +	type pattern struct { +		string +		int +	} +	type matchresult struct { +		value  int +		params map[string]string +		failed bool +	} +	tests := []struct { +		// path-matching pattern and the integers the tree stores for each +		patterns []pattern + +		// paths to match against, and the int we get and captured params +		paths map[string]matchresult +	}{ +		{ +			patterns: []pattern{ +				{"/a", 1}, +				{"/a/*rest", 2}, +				{"/a/b", 3}, +				{"/c", 4}, +				{"/x/:y/z/*rest", 5}, +			}, +			paths: map[string]matchresult{ +				"/a": { +					value:  1, +					params: map[string]string{}, +				}, +				"/a/other": { +					value:  2, +					params: map[string]string{"rest": "other"}, +				}, +				"/a/b": { +					value:  3, +					params: map[string]string{}, +				}, +				"/a/b/c": { +					value:  2, +					params: map[string]string{"rest": "b/c"}, +				}, +				"/c": { +					value:  4, +					params: map[string]string{}, +				}, +				"/c/d": { +					failed: true, +				}, +				"/x/foo/z/bar/baz": { +					value:  5, +					params: map[string]string{"y": "foo", "rest": "bar/baz"}, +				}, +				"/": { +					failed: true, +				}, +			}, +		}, +		{ +			patterns: []pattern{ +				{"/", 10}, +			}, +			paths: map[string]matchresult{ +				"/":    {value: 10, params: map[string]string{}}, +				"/foo": {failed: true}, +			}, +		}, +	} + +	for i, test := range tests { +		t.Run(strconv.Itoa(i+1), func(t *testing.T) { +			tree := &internal.PathTree[int]{} +			for _, pattern := range test.patterns { +				tree.Add(pattern.string, pattern.int) +			} + +			for path, result := range test.paths { +				t.Run(path, func(t *testing.T) { +					n, params := tree.Match(path) +					if result.failed { +						require.Nil(t, n) +					} else { +						require.NotNil(t, n) +						assert.Equal(t, result.value, *n) +						assert.Equal(t, result.params, params) +					} +				}) +			} +		}) +	} +} | 
