package geojson

import "testing"

func TestLineString(t *testing.T) {
	testJSON(t, `{"type":"LineString","coordinates":[[100.1,5.1],[101.1,51.1]]}`)
	testJSON(t, `{"type":"LineString","coordinates":[[100.1,5.1],[101.1,51.1]],"bbox":[10,20,30,40]}`)
	testJSON(t, `{"type":"LineString","coordinates":[[100.1,5.1,15.5],[101.1,51.1,20],[10001.1,71.1,10]],"bbox":[10,20,12,30,40,15]}`)
	testJSON(t, `{
    "type": "LineString",
    "coordinates": [
        [-101.744384765625,39.32155002466662],
        [-101.5521240234375,39.330048552942415],
        [-101.40380859375,39.330048552942415],
        [-101.33239746093749,39.364032338047984],
        [-101.041259765625,39.36827914916011],
        [-100.975341796875,39.30454987014581],
        [-100.9149169921875,39.24501680713314],
        [-100.843505859375,39.16414104768742],
        [-100.8050537109375,39.104488809440475],
        [-100.491943359375,39.10022600175347],
        [-100.43701171875,39.095962936305476],
        [-100.338134765625,39.095962936305476],
        [-100.1953125,39.027718840211605],
        [-100.008544921875,39.01064750994083],
        [-99.86572265625,39.00211029922512],
        [-99.6844482421875,38.97222194853654],
        [-99.51416015625,38.929502416386605],
        [-99.38232421875,38.92095542046727],
        [-99.3218994140625,38.89530825492018],
        [-99.1131591796875,38.86965182408357],
        [-99.0802001953125,38.85682013474361],
        [-98.82202148437499,38.85682013474361],
        [-98.44848632812499,38.84826438869913],
        [-98.20678710937499,38.84826438869913],
        [-98.02001953125,38.8782049970615],
        [-97.635498046875,38.87392853923629]
    ]
}`)
}

func TestLineStringWithinBBox(t *testing.T) {
	bbox := BBox{Min: Position{0, 0, 0}, Max: Position{100, 100, 0}}
	p := testJSON(t, `{"type":"LineString","coordinates":[[10,10],[20,20]],"bbox":[0,0,100,100]}`).(LineString)
	if !p.WithinBBox(bbox) {
		t.Fatal("!")
	}
	p = testJSON(t, `{"type":"LineString","coordinates":[[10,10],[20,20]]}`).(LineString)
	if !p.WithinBBox(bbox) {
		t.Fatal("!")
	}
	p = testJSON(t, `{"type":"LineString","coordinates":[[10,10],[20,20]],"bbox":[-10,-10,100,100]}`).(LineString)
	if p.WithinBBox(bbox) {
		t.Fatal("!")
	}
	p = testJSON(t, `{"type":"LineString","coordinates":[[-10,-10],[-20,-20]]}`).(LineString)
	if p.WithinBBox(bbox) {
		t.Fatal("!")
	}
}

func TestLineStringIntersectsBBox(t *testing.T) {
	bbox := BBox{Min: Position{0, 0, 0}, Max: Position{100, 100, 0}}
	p := testJSON(t, `{"type":"LineString","coordinates":[[10,10],[20,20]],"bbox":[0,0,100,100]}`).(LineString)
	if !p.IntersectsBBox(bbox) {
		t.Fatal("!")
	}
	p = testJSON(t, `{"type":"LineString","coordinates":[[-1,3],[3,-1]]}`).(LineString)
	if !p.IntersectsBBox(bbox) {
		t.Fatal("!")
	}
	p = testJSON(t, `{"type":"LineString","coordinates":[[-1,1],[1,-1]]}`).(LineString)
	if !p.IntersectsBBox(bbox) {
		t.Fatal("!")
	}
	p = testJSON(t, `{"type":"LineString","coordinates":[[-2,1],[1,-1]]}`).(LineString)
	if p.IntersectsBBox(bbox) {
		t.Fatal("!")
	}
}