package noder

import (
	"golang.org/x/text/unicode/norm"
	. "gopkg.in/check.v1"
)

type PathSuite struct{}

var _ = Suite(&PathSuite{})

func (s *PathSuite) TestShortFile(c *C) {
	f := &noderMock{
		name:  "1",
		isDir: false,
	}
	p := Path([]Noder{f})
	c.Assert(p.String(), Equals, "1")
}

func (s *PathSuite) TestShortDir(c *C) {
	d := &noderMock{
		name:     "1",
		isDir:    true,
		children: NoChildren,
	}
	p := Path([]Noder{d})
	c.Assert(p.String(), Equals, "1")
}

func (s *PathSuite) TestLongFile(c *C) {
	n3 := &noderMock{
		name:  "3",
		isDir: false,
	}
	n2 := &noderMock{
		name:     "2",
		isDir:    true,
		children: []Noder{n3},
	}
	n1 := &noderMock{
		name:     "1",
		isDir:    true,
		children: []Noder{n2},
	}
	p := Path([]Noder{n1, n2, n3})
	c.Assert(p.String(), Equals, "1/2/3")
}

func (s *PathSuite) TestLongDir(c *C) {
	n3 := &noderMock{
		name:     "3",
		isDir:    true,
		children: NoChildren,
	}
	n2 := &noderMock{
		name:     "2",
		isDir:    true,
		children: []Noder{n3},
	}
	n1 := &noderMock{
		name:     "1",
		isDir:    true,
		children: []Noder{n2},
	}
	p := Path([]Noder{n1, n2, n3})
	c.Assert(p.String(), Equals, "1/2/3")
}

func (s *PathSuite) TestCompareDepth1(c *C) {
	p1 := Path([]Noder{&noderMock{name: "a"}})
	p2 := Path([]Noder{&noderMock{name: "b"}})
	c.Assert(p1.Compare(p2), Equals, -1)
	c.Assert(p2.Compare(p1), Equals, 1)

	p1 = Path([]Noder{&noderMock{name: "a"}})
	p2 = Path([]Noder{&noderMock{name: "a"}})
	c.Assert(p1.Compare(p2), Equals, 0)
	c.Assert(p2.Compare(p1), Equals, 0)

	p1 = Path([]Noder{&noderMock{name: "a.go"}})
	p2 = Path([]Noder{&noderMock{name: "a"}})
	c.Assert(p1.Compare(p2), Equals, 1)
	c.Assert(p2.Compare(p1), Equals, -1)
}

func (s *PathSuite) TestCompareDepth2(c *C) {
	p1 := Path([]Noder{
		&noderMock{name: "a"},
		&noderMock{name: "b"},
	})
	p2 := Path([]Noder{
		&noderMock{name: "b"},
		&noderMock{name: "a"},
	})
	c.Assert(p1.Compare(p2), Equals, -1)
	c.Assert(p2.Compare(p1), Equals, 1)

	p1 = Path([]Noder{
		&noderMock{name: "a"},
		&noderMock{name: "b"},
	})
	p2 = Path([]Noder{
		&noderMock{name: "a"},
		&noderMock{name: "b"},
	})
	c.Assert(p1.Compare(p2), Equals, 0)
	c.Assert(p2.Compare(p1), Equals, 0)

	p1 = Path([]Noder{
		&noderMock{name: "a"},
		&noderMock{name: "b"},
	})
	p2 = Path([]Noder{
		&noderMock{name: "a"},
		&noderMock{name: "a"},
	})
	c.Assert(p1.Compare(p2), Equals, 1)
	c.Assert(p2.Compare(p1), Equals, -1)
}

func (s *PathSuite) TestCompareMixedDepths(c *C) {
	p1 := Path([]Noder{
		&noderMock{name: "a"},
		&noderMock{name: "b"},
	})
	p2 := Path([]Noder{&noderMock{name: "b"}})
	c.Assert(p1.Compare(p2), Equals, -1)
	c.Assert(p2.Compare(p1), Equals, 1)

	p1 = Path([]Noder{
		&noderMock{name: "b"},
		&noderMock{name: "b"},
	})
	p2 = Path([]Noder{&noderMock{name: "b"}})
	c.Assert(p1.Compare(p2), Equals, 1)
	c.Assert(p2.Compare(p1), Equals, -1)

	p1 = Path([]Noder{&noderMock{name: "a.go"}})
	p2 = Path([]Noder{
		&noderMock{name: "a"},
		&noderMock{name: "a.go"},
	})
	c.Assert(p1.Compare(p2), Equals, 1)
	c.Assert(p2.Compare(p1), Equals, -1)

	p1 = Path([]Noder{&noderMock{name: "b.go"}})
	p2 = Path([]Noder{
		&noderMock{name: "a"},
		&noderMock{name: "a.go"},
	})
	c.Assert(p1.Compare(p2), Equals, 1)
	c.Assert(p2.Compare(p1), Equals, -1)
}

func (s *PathSuite) TestCompareNormalization(c *C) {
	p1 := Path([]Noder{&noderMock{name: norm.NFKC.String("페")}})
	p2 := Path([]Noder{&noderMock{name: norm.NFKD.String("페")}})
	c.Assert(p1.Compare(p2), Equals, 1)
	c.Assert(p2.Compare(p1), Equals, -1)
	p1 = Path([]Noder{&noderMock{name: "TestAppWithUnicodéPath"}})
	p2 = Path([]Noder{&noderMock{name: "TestAppWithUnicodéPath"}})
	c.Assert(p1.Compare(p2), Equals, -1)
	c.Assert(p2.Compare(p1), Equals, 1)
}
