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
|
package main
import (
"strings"
"testing"
)
func expect(t *testing.T, expected string, returned string) {
if strings.Compare(returned, expected) != 0 {
t.Fatalf("Expected(%d): `%s`\nGot(%d): `%s`\n",
len(expected), expected,
len(returned), returned)
}
}
func TestIDLParser(t *testing.T) {
pkgname, b, err := generateTemplate(`
# Interface to jump a spacecraft to another point in space. The
# FTL Drive is the propulsion system to achieve faster-than-light
# travel through space. A ship making a properly calculated
# jump can arrive safely in planetary orbit, or alongside other
# ships or spaceborne objects.
interface org.example.ftl
# The current state of the FTL drive and the amount of fuel
# available to jump.
type DriveCondition (
state: (idle, spooling, busy),
booster: bool,
active_engines: [](id: int, state: bool),
tylium_level: int
)
# Speed, trajectory and jump duration is calculated prior to
# activating the FTL drive.
type DriveConfiguration (
speed: int,
trajectory: int,
duration: int
)
# The galactic coordinates use the Sun as the origin. Galactic
# longitude is measured with primary direction from the Sun to
# the center of the galaxy in the galactic plane, while the
# galactic latitude measures the angle of the object above the
# galactic plane.
type Coordinate (
longitude: float,
latitude: float,
distance: int
)
# Monitor the drive. The method will reply with an update whenever
# the drive's state changes
method Monitor() -> (condition: DriveCondition)
# Calculate the drive's jump parameters from the current
# position to the target position in the galaxy
method CalculateConfiguration(
current: Coordinate,
target: Coordinate
) -> (configuration: DriveConfiguration)
# Jump to the calculated point in space
method Jump(configuration: DriveConfiguration) -> ()
# There is not enough tylium to jump with the given parameters
error NotEnoughEnergy ()
# The supplied parameters are outside the supported range
error ParameterOutOfRange (field: string)
# some more coverage
method Foo(interface: string) -> (ret: (go: string, switch: bool, more: (t:bool, f:bool)))
`)
if err != nil {
t.Fatalf("Error parsing %v", err)
}
expect(t, "orgexampleftl", pkgname)
if len(b) <= 0 {
t.Fatal("No generated go source")
}
// FIXME: compare b.String() against expected output
}
|