1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
import unittest
import warnings
from gmplot.utility import StringIO
from gmplot.writer import _Writer
from gmplot.gmplot import _format_LatLng, _Route, GoogleMapPlotter, InvalidSymbolError
class GMPlotTest(unittest.TestCase):
def test_format_LatLng(self):
self.assertEqual(_format_LatLng(45.123456, -80.987654), 'new google.maps.LatLng(45.123456, -80.987654)')
self.assertEqual(_format_LatLng(45.123456, -80.987654, 4), 'new google.maps.LatLng(45.1235, -80.9877)')
self.assertEqual(_format_LatLng(45.1, -80.9, 3), 'new google.maps.LatLng(45.100, -80.900)')
# Note: This test only ensures that Route's functions can be called without failing,
# it doesn't test if the resulting output can actually be rendered properly in a browser.
class RouteTest(unittest.TestCase):
def test_write(self):
route = _Route((37.770776,-122.461689), (37.780776,-122.461689))
with StringIO() as f:
with _Writer(f) as writer:
route.write(writer)
def test_write_waypoints(self):
route = _Route((37.770776,-122.461689), (37.780776,-122.461689), waypoints=[(37.431257,-122.133121)])
with StringIO() as f:
with _Writer(f) as writer:
route.write(writer)
# Note: This test only ensures that GoogleMapPlotter's functions can be called without failing,
# it doesn't test if the resulting map can actually be rendered properly in a browser.
class GoogleMapPlotterTest(unittest.TestCase):
PATH_1 = [(37.429, 37.428, 37.427, 37.427, 37.427),
(-122.145, -122.145, -122.145, -122.146, -122.146)]
PATH_2 = [[i+.01 for i in PATH_1[0]], [i+.02 for i in PATH_1[1]]]
PATH_3 = [(37.433302, 37.431257, 37.427644, 37.430303), (-122.14488, -122.133121, -122.137799, -122.148743)]
PATH_4 = [(37.423074, 37.422700, 37.422410, 37.422188, 37.422274, 37.422495, 37.422962, 37.423552, 37.424387, 37.425920, 37.425937),
(-122.150288, -122.149794, -122.148936, -122.148142, -122.146747, -122.14561, -122.144773, -122.143936, -122.142992, -122.147863, -122.145953)]
def test_get(self):
bounds = {'north':37.832285, 'south': 37.637336, 'west': -122.520364, 'east': -122.346922}
map = GoogleMapPlotter(37.428, -122.145, 16, fit_bounds=bounds)
# Test marker:
map.marker(37.427, -122.145, "yellow")
map.marker(37.428, -122.146, "cornflowerblue")
map.marker(37.429, -122.144, "k", title='Here')
map.marker(37.430, -122.142, "red", label='A')
# Test circle:
map.circle(37.429, -122.145, 100, "#FF0000", ew=2)
# Test plot:
map.plot(self.PATH_1[0], self.PATH_1[1], "plum", edge_width=10)
map.plot(self.PATH_2[0], self.PATH_2[1], "red")
# Test directions:
map.directions((37.770776,-122.461689), (37.780776,-122.461689), waypoints=[(37.431257,-122.133121)])
# Test polygon:
map.polygon(self.PATH_3[0], self.PATH_3[1], edge_color="cyan", edge_width=5, face_color="blue", face_alpha=0.1)
# Test heatmap:
map.heatmap(self.PATH_4[0], self.PATH_4[1], radius=40, weights=[1, 1, 1, 0.5, 0.5, 0.5, 1, 1, 1, 2, 2])
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
map.heatmap(self.PATH_3[0], self.PATH_3[1], threshold=10, radius=40, dissipating=False, gradient=[(30,30,30,0), (30,30,30,1), (50, 50, 50, 1)])
self.assertEqual(len(w), 1, "'heatmap()' should raise a single warning")
self.assertTrue(issubclass(w[-1].category, FutureWarning), "'heatmap()' should raise a 'FutureWarning'")
# Test scatter:
map.scatter(self.PATH_3[0], self.PATH_3[1], c='r', marker=[True, False, False, True])
map.scatter(self.PATH_4[0], self.PATH_4[1], size=[1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2], symbol='x')
map.scatter(self.PATH_4[0], self.PATH_4[1], s=90, marker=False, alpha=0.9, symbol='+', c='red', edge_width=4)
map.scatter(self.PATH_3[0], self.PATH_3[1],
color=['r','g','b','k'],
precision=[1,2,3,4],
marker=[True, True, False, True],
title=['First', 'Second', 'Third', 'Fourth'],
label=['A','B','C','D'],
size=[10,20,30,40],
symbol=['+','o','x','x']
)
# Test ground overlay:
bounds_dict = {'north':37.832285, 'south': 37.637336, 'west': -122.520364, 'east': -122.346922}
map.ground_overlay('http://explore.museumca.org/creeks/images/TopoSFCreeks.jpg', bounds_dict, opacity=0.5)
map.get()
def test_scatter_length_mismatch(self):
map = GoogleMapPlotter(37.428, -122.145, 16)
with self.assertRaises(ValueError):
map.scatter(self.PATH_3[0], self.PATH_3[1],
color=['r','g','b'],
precision=[1,2],
marker=[True],
title=['First', 'Second'],
label=['A','B','C','D','E'],
size=[10,20],
symbol=['+','o','x','x','o']
)
def test_invalid_symbol(self):
map = GoogleMapPlotter(37.428, -122.145, 16)
map.scatter(self.PATH_4[0], self.PATH_4[1], s=90, marker=False, alpha=0.9, symbol='z', c='red', edge_width=4)
with self.assertRaises(InvalidSymbolError):
map.get()
def test_grid(self):
map = GoogleMapPlotter(37.428, -122.145, 16)
map.grid(37.42, 37.43, 0.001, -122.15, -122.14, 0.001)
map.get()
def test_map_styles(self):
map_styles = [
{
'featureType': 'all',
'stylers': [
{'saturation': -80},
{'lightness': 60},
]
}
]
map = GoogleMapPlotter(37.428, -122.145, 16, map_type='satellite', map_styles=map_styles, tilt=0, scale_control=True)
map.get()
def test_unsupported_marker_color(self):
map = GoogleMapPlotter(37.428, -122.145, 16)
map.marker(37.428, -122.146, "#123456") # (valid but unsupported color)
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
map.get()
self.assertEqual(len(w), 1, "'get()' should raise a single warning")
self.assertTrue(issubclass(w[-1].category, UserWarning), "'get()' should raise a 'UserWarning'")
|