1# Command covered: geomap::place
2#
3#	This script file tests the commands in the tclgeomap package.  See the
4#	tclgeomap man page for a description of the package.  See the tcltest
5#	man page for a description of Tcl's testing proc's.
6#
7#  Copyright (c) 2004 Gordon D. Carrie.  All rights reserved.
8#
9#  Licensed under the Open Software License version 2.1
10#
11#  Please address questions and feedback to user0@tkgeomap.org
12#
13# @(#) $Id: tcl_geomap_place.test,v 1.4 2004/09/22 21:57:51 tkgeomap Exp $
14
15if {[lsearch [namespace children] ::tcltest] == -1} {
16    package require tcltest
17    namespace import ::tcltest::*
18}
19
20package require tclgeomap 2
21
22test tcl_geomap_place-1.1 {::geomap::place new, wrong number of arguments} {
23    catch {::geomap::place new p1} msg
24    set msg
25} {wrong # args: should be "::geomap::place new placeName {lat lon}"}
26
27test tcl_geomap_place-1.2 {::geomap::place new, normal call} {
28    ::geomap::place new p1 {0.0 10.0}
29    list p1 [p1 set]
30} {p1 {0.0 10.0}}
31
32rename p1 {}
33
34test tcl_geomap_place-2.1 {place set, wrong number of arguments} {
35    catch {::geomap::place set} msg
36    set msg
37} {wrong # args: should be "::geomap::place set placeName ?{lat lon}?"}
38
39test tcl_geomap_place-2.2 {::geomap::place set, creating a place} {
40    ::geomap::place set p1 {10.0 10.0}
41    list p1 [p1 set]
42} {p1 {10.0 10.0}}
43
44rename p1 {}
45
46test tcl_geomap_place-2.3 {::geomap::place set, moving places} {
47    ::geomap::place new p1 {10.0 10.0}
48    ::geomap::place set p2 {20.0 20.0}
49    set placeList [list p1 [p1 set] p2 [p2 set]]
50    ::geomap::place set p1 {11.0 11.0}
51    ::geomap::place set p2 {21.0 21.0}
52    concat $placeList [list p1 [p1 set] p2 [p2 set]]
53} {p1 {10.0 10.0} p2 {20.0 20.0} p1 {11.0 11.0} p2 {21.0 21.0}}
54
55rename p1 {}
56rename p2 {}
57
58test tcl_geomap_place-2.4 {::geomap::place set, placeName set, moving places} {
59    ::geomap::place set p1 {11.0 11.0}
60    ::geomap::place set p2 {21.0 21.0}
61    set placeList [list p1 [p1 set] p2 [p2 set]]
62    p1 set {12.0 12.0}
63    p2 set {22.0 22.0}
64    concat $placeList [list p1 [p1 set] p2 [p2 set]]
65} {p1 {11.0 11.0} p2 {21.0 21.0} p1 {12.0 12.0} p2 {22.0 22.0}}
66
67rename p1 {}
68rename p2 {}
69
70test tcl_geomap_place-4.1 {::geomap::place distance, wrong number of arguments} {
71    catch {::geomap::place distance} msg
72    set msg
73} {wrong # args: should be "::geomap::place distance placeOR{lat lon} placeOR{lat lon} ?unit?"}
74
75test tcl_geomap_place-4.2 {::geomap::place distance, two places} {
76    ::geomap::place new p1 {0.0 0.0}
77    ::geomap::place new p2 {0.0 10.0}
78    ::geomap::place distance p1 p2
79} {10.0}
80
81rename p1 {}
82rename p2 {}
83
84test tcl_geomap_place-4.3 {::geomap::place distance, two coordinate pairs} {
85    ::geomap::place distance {80.0 -10.0} {75.0 170.0}
86} {25.0}
87
88test tcl_geomap_place-4.4 {::geomap::place distance, place and coordinate pair} {
89    ::geomap::place new p1 {0.0 170.0}
90    ::geomap::place distance p1 {75.0 170.0}
91} {75.0}
92
93rename p1 {}
94
95test tcl_geomap_place-4.5 {::geomap::place distance, error with a place in namespace} {
96    namespace eval n1 {
97	::geomap::place new [namespace current]::p1 {0.0 170.0}
98    }
99    catch {::geomap::place distance {75.0 170.0} p1} msg
100    set msg
101} {p1 not a location}
102
103namespace delete n1
104
105test tcl_geomap_place-4.6 {::geomap::place distance, with a place in namespace} {
106    namespace eval n1 {
107	::geomap::place new [namespace current]::p1 {0.0 170.0}
108    }
109    namespace eval n1 {
110	::geomap::place distance {75.0 170.0} p1
111    }
112} {75.0}
113
114namespace delete n1
115
116test tcl_geomap_place-4.7 {::geomap::place distance, two places, answer with unit} {
117    ::geomap::place new p1 {0.0 0.0}
118    ::geomap::place new p2 {0.0 10.0}
119    ::geomap::place distance p1 p2 km
120} {1111.2}
121
122rename p1 {}
123rename p2 {}
124
125test tcl_geomap_place-4.8 {::geomap::place distance, two places, answer with unit} {
126    ::geomap::place new p1 {0.0 0.0}
127    ::geomap::place new p2 {0.0 10.0}
128    ::geomap::place distance p1 p2 nmile
129} {600.0}
130
131rename p1 {}
132rename p2 {}
133
134test tcl_geomap_place-5.1 {::geomap::place azrng, wrong number of arguments} {
135    catch {::geomap::place azrng} msg
136    set msg
137} {wrong # args: should be "::geomap::place azrng placeOR{lat lon} placeOR{lat lon} ?unit?"}
138
139test tcl_geomap_place-5.2 {::geomap::place azrng} {
140    ::geomap::place new p1 {-1.0 -1.0}
141    ::geomap::place new p2 {1.0 1.0}
142    eval format {%.1f\ %.1f} [::geomap::place azrng p1 p2]
143} {45.0 2.8}
144
145rename p1 {}
146rename p2 {}
147
148test tcl_geomap_place-6.1 {::geomap::place nearest, wrong number of arguments} {
149    catch {::geomap::place nearest} msg
150    set msg
151} {wrong # args: should be "::geomap::place nearest placeOR{lat lon} {place place ...}"}
152
153test tcl_geomap_place-6.2 {::geomap::place nearest} {
154    ::geomap::place new p1 {0 0}
155    ::geomap::place new p2 {1 1}
156    ::geomap::place new p3 {2 2}
157    ::geomap::place nearest p1 {p1 p2 p3}
158} {p2}
159
160rename p1 {}
161rename p2 {}
162rename p3 {}
163
164test tcl_geomap_place-6.3 {placeName nearest, bad place list} {
165    ::geomap::place new p1 {0 0}
166    catch {p1 nearest foo} msg
167    set msg
168} {No place named foo in current namespace.}
169
170rename p1 {}
171
172test tcl_geomap_place-6.4 {::geomap::place nearest, placeName command} {
173    ::geomap::place new p1 {0 0}
174    ::geomap::place new p2 {1 1}
175    ::geomap::place new p3 {2 2}
176    p1 nearest {p1 p2 p3}
177} {p2}
178
179rename p1 {}
180rename p2 {}
181rename p3 {}
182
183test tcl_geomap_place-7.1 {::geomap::place step, wrong number of arguments} {
184    catch {::geomap::place step} msg
185    set msg
186} {wrong # args: should be "::geomap::place step placeName bearing range ?unit?"}
187
188test tcl_geomap_place-7.2 {::geomap::place step} {
189    ::geomap::place new p1 {0 0}
190    ::geomap::place step p1 0.0 10.0
191} {10.0 0.0}
192
193rename p1 {}
194
195test tcl_geomap_place-7.3 {::geomap::place step with unit} {
196    ::geomap::place new p1 {0 0}
197    eval format {%.2f\ %.2f} [::geomap::place step p1 45.0 100.0 km]
198} {0.64 0.64}
199
200rename p1 {}
201
202test tcl_geomap_place-7.4 {::geomap::place step with unit error} {
203    ::geomap::place new p1 {0 0}
204    catch "::geomap::place step p1 45.0 100.0 leagues" msg
205    set msg
206} {bad unit "leagues": must be nmiles, smiles, km, or gsdeg}
207
208rename p1 {}
209
210test tcl_geomap_place-7.5 {::geomap::place step with bearing word} {
211    ::geomap::place new p1 {0 0}
212    eval format {%.2f\ %.2f} [::geomap::place step p1 ne 100.0 km]
213} {0.64 0.64}
214
215rename p1 {}
216
217test tcl_geomap_place-7.6 {::geomap::place step with bad bearing word} {
218    ::geomap::place new p1 {0 0}
219    catch "::geomap::place step p1 thataway 100.0 km" msg
220    set msg
221} {bad bearing "thataway": must be north, nneast, neast, eneast, east, eseast, seast, sseast, south, sswest, swest, wswest, west, wnwest, nwest, or nnwest, or a double value}
222
223rename p1 {}
224
225test tcl_geomap_place-7.7 {placeName step, wrong number of arguments} {
226  ::geomap::place new p1 {0 0}
227  catch {p1 step} msg
228  set msg
229} {wrong # args: should be "p1 step bearing range ?unit?"}
230
231rename p1 {}
232
233test tcl_geomap_place-8.1 {::geomap::place inrange} {
234    ::geomap::place new p1 {0 0}
235    ::geomap::place new p2 {3 3}
236    ::geomap::place new p3 {4 4}
237    ::geomap::place new p4 {2 2}
238    lsort [::geomap::place inrange p1 4.5 {p1 p2 p3 p4}]
239} {p2 p4}
240
241rename p1 {}
242rename p2 {}
243rename p3 {}
244rename p4 {}
245
246test tcl_geomap_place-8.2 {::geomap::place inrange, wrong number of arguments} {
247    catch {::geomap::place inrange} msg
248    set msg
249} {wrong # args: should be "::geomap::place inrange  placeNameOR{lat lon} {range ?unit?} {place place ...}"}
250
251test tcl_geomap_place-8.3 {::geomap::place inrange, with placeName command} {
252    ::geomap::place new p1 {0 0}
253    ::geomap::place new p2 {1 1}
254    ::geomap::place new p3 {4 4}
255    ::geomap::place new p4 {1 1}
256    lsort [p1 inrange 4.0 {p1 p2 p3 p4}]
257} {p2 p4}
258
259rename p1 {}
260rename p2 {}
261rename p3 {}
262rename p4 {}
263
264test tcl_geomap_place-8.5 {::geomap::place inrange, with unit} {
265    ::geomap::place new p1 {0 0}
266    ::geomap::place new p2 {1 1}
267    ::geomap::place new p3 {4 4}
268    ::geomap::place new p4 {1 1}
269    lsort [p1 inrange {400.0 km} {p1 p2 p3 p4}]
270} {p2 p4}
271
272cleanupTests
273