2016-03-05 02:08:16 +03:00
|
|
|
package bing
|
|
|
|
|
|
|
|
import (
|
|
|
|
"math/rand"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestLevelFuzz(t *testing.T) {
|
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
for i := 0; i < 10000; i++ {
|
|
|
|
level := (rand.Int() % MaxLevelOfDetail) + 1
|
|
|
|
quad := ""
|
|
|
|
for j := 0; j < level; j++ {
|
|
|
|
quad += string(byte(rand.Int()%4) + '0')
|
|
|
|
}
|
|
|
|
tileX, tileY, levelOfDetail := QuadKeyToTileXY(quad)
|
|
|
|
if levelOfDetail != uint64(len(quad)) {
|
|
|
|
t.Fatalf("[%d,%d] levelOfDetail == %d, expect %d", i, level, levelOfDetail, len(quad))
|
|
|
|
}
|
|
|
|
pixelX, pixelY := TileXYToPixelXY(tileX, tileY)
|
|
|
|
latitude, longitude := PixelXYToLatLong(pixelX, pixelY, levelOfDetail)
|
|
|
|
pixelX2, pixelY2 := LatLongToPixelXY(latitude, longitude, levelOfDetail)
|
|
|
|
if pixelX2 != pixelX {
|
|
|
|
t.Fatalf("[%d,%d] pixelX2 == %d, expect %d", i, level, pixelX2, pixelX)
|
|
|
|
}
|
|
|
|
if pixelY2 != pixelY {
|
|
|
|
t.Fatalf("[%d,%d] pixelY2 == %d, expect %d", i, level, pixelY2, pixelY)
|
|
|
|
}
|
|
|
|
tileX2, tileY2 := PixelXYToTileXY(pixelX2, pixelY2)
|
|
|
|
if tileX2 != tileX {
|
|
|
|
t.Fatalf("[%d,%d] tileX2 == %d, expect %d", i, level, tileX2, tileX)
|
|
|
|
}
|
|
|
|
if tileY2 != tileY {
|
|
|
|
t.Fatalf("[%d,%d] tileY2 == %d, expect %d", i, level, tileY2, tileY)
|
|
|
|
}
|
|
|
|
quad2 := TileXYToQuadKey(tileX2, tileY2, levelOfDetail)
|
|
|
|
if quad2 != quad {
|
|
|
|
t.Fatalf("[%d,%d] quad2 == %s, expect %s", i, level, quad2, quad)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestInvalidQuadKeyFuzz(t *testing.T) {
|
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
for i := 0; i < 10000; i++ {
|
|
|
|
func() {
|
|
|
|
defer func() {
|
|
|
|
var s string
|
|
|
|
if v := recover(); v != nil {
|
|
|
|
s = v.(string)
|
|
|
|
}
|
|
|
|
if s != "Invalid QuadKey digit sequence." {
|
|
|
|
t.Fatalf("s == '%s', expect '%s", s, "Invalid QuadKey digit sequence.")
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
level := (rand.Int() % MaxLevelOfDetail) + 1
|
|
|
|
|
|
|
|
valid := true
|
|
|
|
quad := ""
|
|
|
|
for valid {
|
|
|
|
quad = ""
|
|
|
|
for j := 0; j < level; j++ {
|
|
|
|
c := byte(rand.Int()%5) + '0'
|
|
|
|
quad += string(c)
|
|
|
|
if c < '0' || c > '3' {
|
|
|
|
valid = false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
QuadKeyToTileXY(quad)
|
|
|
|
}()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLatLonClippingFuzz(t *testing.T) {
|
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
for i := 0; i < 10000; i++ {
|
|
|
|
lat := clip(rand.Float64()*180.0-90.0, MinLatitude, MaxLatitude)
|
|
|
|
lon := clip(rand.Float64()*380.0-180.0, MinLongitude, MaxLongitude)
|
|
|
|
if lat < MinLatitude {
|
|
|
|
t.Fatalf("lat == %f, expect < %f", lat, MinLatitude)
|
|
|
|
}
|
|
|
|
if lat > MaxLatitude {
|
|
|
|
t.Fatalf("lat == %f, expect > %f", lat, MaxLatitude)
|
|
|
|
}
|
|
|
|
if lon < MinLongitude {
|
|
|
|
t.Fatalf("lon == %f, expect < %f", lon, MinLongitude)
|
|
|
|
}
|
|
|
|
if lon > MaxLongitude {
|
|
|
|
t.Fatalf("lon == %f, expect > %f", lon, MaxLongitude)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-04-20 03:24:47 +03:00
|
|
|
|
|
|
|
func TestIssue302(t *testing.T) {
|
|
|
|
// Requesting tile with zoom level > 63 crashes the server #302
|
|
|
|
for z := uint64(0); z < 256; z++ {
|
|
|
|
tileX, tileY := PixelXYToTileXY(LatLongToPixelXY(33, -115, z))
|
|
|
|
TileXYToBounds(tileX, tileY, z)
|
|
|
|
}
|
|
|
|
}
|