Skip to content

Commit 582c94e

Browse files
committed
Few additional tests
1 parent 05477e3 commit 582c94e

File tree

2 files changed

+48
-50
lines changed

2 files changed

+48
-50
lines changed

src/gentypes.jl

Lines changed: 42 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,28 @@ export @rosimport, rostypegen, rostypereset, gentypes, cleartypes
66
#Composite types for internal use. Keeps track of the imported types and helps
77
#keep code generation orderly.
88
abstract ROSModule
9-
type ROSMsgModule <: ROSModule
9+
type ROSPackage
1010
name::ASCIIString
11+
msg::ROSModule
12+
srv::ROSModule
13+
function ROSPackage(pkgname::String)
14+
pkg = new(pkgname)
15+
pkg.msg = ROSMsgModule(pkg)
16+
pkg.srv = ROSSrvModule(pkg)
17+
pkg
18+
end
19+
end
20+
type ROSMsgModule <: ROSModule
21+
pkg::ROSPackage
1122
members::Vector{ASCIIString}
1223
deps::Set{ASCIIString}
13-
function ROSMsgModule(mname::String)
14-
new(mname,
15-
ASCIIString[],
16-
Set{ASCIIString}()
17-
)
18-
end
24+
ROSMsgModule(pkg) = new(pkg, ASCIIString[], Set{ASCIIString}())
1925
end
2026
type ROSSrvModule <: ROSModule
21-
name::ASCIIString
27+
pkg::ROSPackage
2228
members::Vector{ASCIIString}
2329
deps::Set{ASCIIString}
24-
function ROSSrvModule(mname::String)
25-
new(mname,
26-
ASCIIString[],
27-
Set{ASCIIString}()
28-
)
29-
end
30-
end
31-
type ROSPackage
32-
name::ASCIIString
33-
msg::ROSMsgModule
34-
srv::ROSSrvModule
35-
function ROSPackage(pkgname::String)
36-
new(pkgname, ROSMsgModule(pkgname), ROSSrvModule(pkgname))
37-
end
30+
ROSSrvModule(pkg) = new(pkg, ASCIIString[], Set{ASCIIString}())
3831
end
3932

4033
#These two global objects maintain the hierarchy from multiple calls to
@@ -156,8 +149,8 @@ cleartypes() = error("cleartypes() renamed to rostypereset()")
156149
function addtype!(mod::ROSMsgModule, typ::String)
157150
global _rospy_objects
158151
if ! (typ in mod.members)
159-
@debug("Message type import: ", _modname(mod), ".", typ)
160-
pymod, pyobj = _pyvars(_modname(mod), typ)
152+
@debug("Message type import: ", _fullname(mod), ".", typ)
153+
pymod, pyobj = _pyvars(_fullname(mod), typ)
161154

162155
deptypes = pyobj[:_slot_types]
163156
_importdeps!(mod, deptypes)
@@ -172,8 +165,8 @@ end
172165
function addtype!(mod::ROSSrvModule, typ::String)
173166
global _rospy_objects
174167
if ! (typ in mod.members)
175-
@debug("Service type import: ", _modname(mod), ".", typ)
176-
pymod, pyobj = _pyvars(_modname(mod), typ)
168+
@debug("Service type import: ", _fullname(mod), ".", typ)
169+
pymod, pyobj = _pyvars(_fullname(mod), typ)
177170

178171
if ! haskey(pyobj, "_request_class")
179172
error(string("Incorrect service name: ", typ))
@@ -201,7 +194,7 @@ function _pyvars(modname::String, typ::String)
201194
try pymod.pymember(typ)
202195
catch ex
203196
if isa(ex, KeyError)
204-
error("$typ not found in package: $modname")
197+
throw(KeyError("'$typ' in package '$modname'"))
205198
else
206199
rethrow(ex)
207200
end
@@ -230,7 +223,7 @@ function _importdeps!(mod::ROSModule, deps::Vector)
230223
#Dependencies will always be messages only
231224
depmod = _rospy_imports[pkgname].msg
232225
#pushing to a set does not create duplicates
233-
push!(mod.deps, depmod.name)
226+
push!(mod.deps, _name(depmod))
234227

235228
addtype!(depmod, typename)
236229
@debug_subindent
@@ -241,9 +234,6 @@ end
241234
#Bring in the python modules as needed
242235
function _import_rospy_pkg(package::String)
243236
pkg, ptype = split(package, '.')
244-
if ptype != "msg" && ptype != "srv"
245-
throw(ArgumentError("Improper import call for package: $package"))
246-
end
247237
pypkg = symbol(string("py_",pkg,"_",ptype))
248238
if ! isdefined(RobotOS, pypkg)
249239
@debug("Importing python package: ", package)
@@ -260,10 +250,10 @@ end
260250

261251
#The function that creates and fills the generated top-level modules
262252
function buildpackage(pkg::ROSPackage)
263-
@debug("Building package: ", pkg.name)
253+
@debug("Building package: ", _name(pkg))
264254

265255
#Create the top-level module for the package in Main
266-
pkgsym = symbol(pkg.name)
256+
pkgsym = symbol(_name(pkg))
267257
pkgcode = Expr(:toplevel, :(module ($pkgsym) end))
268258
Main.eval(pkgcode)
269259
pkgmod = Main.eval(pkgsym)
@@ -291,7 +281,7 @@ end
291281

292282
#Generate all code for a .msg or .srv module
293283
function modulecode(mod::ROSModule)
294-
@debug("submodule: ", _modname(mod))
284+
@debug("submodule: ", _fullname(mod))
295285
modcode = Expr[]
296286

297287
#Common imports
@@ -324,7 +314,7 @@ end
324314
#The imports specific to each module, including dependant packages
325315
function _importexprs(mod::ROSMsgModule)
326316
imports = Expr[Expr(:import, :RobotOS, :MsgT)]
327-
othermods = filter(d -> d != mod.name, mod.deps)
317+
othermods = filter(d -> d != _name(mod), mod.deps)
328318
append!(imports, [Expr(:using,symbol(m),:msg) for m in othermods])
329319
imports
330320
end
@@ -382,29 +372,28 @@ end
382372
#Will create 3 different composite types.
383373
function buildtype(mod::ROSSrvModule, typename::String)
384374
global _rospy_objects
385-
fulltypestr = _rostypestr(mod, typename)
386375

387-
req_str = string(fulltypestr,"Request")
388-
reqobj = _rospy_objects[req_str]
376+
req_typestr = _rostypestr(mod, string(typename,"Request"))
377+
reqobj = _rospy_objects[req_typestr]
389378
memnames = reqobj[:__slots__]
390379
memtypes = reqobj[:_slot_types]
391380
reqmems = collect(zip(memnames, memtypes))
392-
pyreq = :(RobotOS._rospy_objects[$req_str])
393-
reqexprs = typecode(req_str, :SrvT, reqmems)
381+
pyreq = :(RobotOS._rospy_objects[$req_typestr])
382+
reqexprs = typecode(req_typestr, :SrvT, reqmems)
394383

395-
resp_str = string(fulltypestr,"Response")
396-
respobj = _rospy_objects[resp_str]
384+
resp_typestr = _rostypestr(mod, string(typename,"Response"))
385+
respobj = _rospy_objects[resp_typestr]
397386
memnames = respobj[:__slots__]
398387
memtypes = respobj[:_slot_types]
399388
respmems = collect(zip(memnames, memtypes))
400-
pyresp = :(RobotOS._rospy_objects[$resp_str])
401-
respexprs = typecode(resp_str, :SrvT, respmems)
389+
pyresp = :(RobotOS._rospy_objects[$resp_typestr])
390+
respexprs = typecode(resp_typestr, :SrvT, respmems)
402391

403392
defsym = symbol(typename)
404393
reqsym = symbol(string(typename,"Request"))
405394
respsym = symbol(string(typename,"Response"))
406395
srvexprs = Expr[
407-
:(type $defsym <: ServiceDefinition end),
396+
:(immutable $defsym <: ServiceDefinition end),
408397
:(_typerepr(::Type{$defsym}) = $(_rostypestr(mod,typename))),
409398
:(_srv_reqtype(::Type{$defsym}) = $reqsym),
410399
:(_srv_resptype(::Type{$defsym}) = $respsym),
@@ -419,7 +408,7 @@ end
419408
# (3) convert(PyObject, ...)
420409
# (4) convert(..., o::PyObject)
421410
function typecode(rosname::String, super::Symbol, members::Vector)
422-
pkg, tname = _splittypestr(rosname)
411+
tname = _splittypestr(rosname)[2]
423412
@debug("Type: ", tname)
424413
tsym = symbol(tname)
425414

@@ -568,7 +557,7 @@ function _order(d::Dict)
568557
tlist
569558
end
570559

571-
_rostypestr(mod::ROSModule, name::String) = string(mod.name,"/",name)
560+
_rostypestr(mod::ROSModule, name::String) = string(_name(mod),"/",name)
572561
function _splittypestr(typestr::String)
573562
if ! _isrostype(typestr)
574563
error(string("Invalid message type '$typestr', ",
@@ -634,6 +623,10 @@ _typerepr{T}(::Type{T}) = error("Not a ROS type")
634623
_srv_reqtype{T}( ::Type{T}) = error("Not a ROS Service type")
635624
_srv_resptype{T}(::Type{T}) = error("Not a ROS Service type")
636625

626+
#Accessors for the package name
627+
_name(p::ROSPackage) = p.name
628+
_name(m::ROSModule) = _name(m.pkg)
629+
637630
#Get the full ROS name for a module (e.g., 'std_msgs.msg' or nav_msgs.srv')
638-
_modname(m::ROSMsgModule) = string(m.name, ".msg")
639-
_modname(m::ROSSrvModule) = string(m.name, ".srv")
631+
_fullname(m::ROSMsgModule) = string(_name(m), ".msg")
632+
_fullname(m::ROSSrvModule) = string(_name(m), ".srv")

test/typegeneration.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22
using PyCall
33
using Compat
44

5-
@rosimport std_msgs.msg.Empty
65
@rosimport geometry_msgs.msg: PoseStamped, Vector3
76
@rosimport std_srvs.srv.Empty
87
@rosimport nav_msgs.srv.GetPlan
8+
@rosimport std_msgs.msg: Empty
99
@rosimport std_msgs.msg: Float64, String
10+
11+
@test_throws ErrorException @rosimport fake_msgs.msg.FakeMsg
12+
@test_throws KeyError @rosimport std_msgs.msg.FakeMsg
13+
@test_throws ErrorException @rosimport nav_msgs.srv.GetPlanRequest
1014
rostypegen()
1115

1216
@test isdefined(:geometry_msgs)
@@ -47,6 +51,7 @@ pose2 = convert(geometry_msgs.msg.PoseStamped, pypose)
4751
@test pose2.pose.position.x == 1.
4852
@test pose2.pose.position.y == 2.
4953
@test pose2.pose.position.z == 3.
54+
@test_throws InexactError convert(geometry_msgs.msg.Pose, pypose)
5055

5156
#Proper array handling
5257
path = nav_msgs.msg.Path()

0 commit comments

Comments
 (0)