slidefield 0.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 432c7fea51dcaa280f10298b0c4b80517ceed018
4
- data.tar.gz: c686d4efb53164e7c2720d3d1c722f737a3425fb
3
+ metadata.gz: c3bc77b80a6d3d653b3be6506daa06a6d4ecf1d8
4
+ data.tar.gz: 1be3a9e2f0b2d0eaf81b7e3e8dd27003c3847605
5
5
  SHA512:
6
- metadata.gz: 6826438b382dfbd311d740485d8d8cab8da396f8dc9a7872042fcf1b86e327e82bba6183d6ea9254499c606907075f7241afd162325bfdad560164a3b7d5a093
7
- data.tar.gz: 286678e59fac2e0b4b2bc1b261bd163be4819a68feeaec10923384bce50356145cd5ff140e98fcc05c7e46c4abab668237a54e7e9e060cbf637023d25c8e16ef
6
+ metadata.gz: 159f8368156d312baaf045ee4414c33999f40ac9fad8eff0e0a3a2b24acc9d36f2570f84783e82887a246f80be3be3aa22bd7566d379e0b56778a06b807b706d
7
+ data.tar.gz: 4ba661ac98cc08dc6d49da1895b1697c77b792303318b54d650d77b1a4ec8c7ee1aa3f77521295abf6da3667c3ca4557745d164b51a3cce39b4852709eaf8eaf
data/README.md CHANGED
@@ -9,7 +9,6 @@ Requirements: ruby, sdl, sdl_ttf, freeimage
9
9
 
10
10
  $ gem install slidefield
11
11
 
12
-
13
12
  ## Usage
14
13
 
15
14
  $ slidefield [options] [file ...]
@@ -37,7 +36,7 @@ The type of the variable cannot be changed after the variable creation.
37
36
 
38
37
  Integers:
39
38
 
40
- variable = 42
39
+ variable = 42
41
40
  variable += 2 % add
42
41
  variable -= 10 % subtract
43
42
  variable *= 6 % multiply
@@ -46,7 +45,7 @@ Integers:
46
45
 
47
46
  Character strings:
48
47
 
49
- variable = "hello"
48
+ variable = "hello"
50
49
  variable += " world!\n" % append
51
50
  variable -= "!" % remove the bang
52
51
  variable *= "3" % multiply by 3
@@ -54,7 +53,7 @@ Character strings:
54
53
 
55
54
  Size or point coordinates:
56
55
 
57
- variable = 2x4
56
+ variable = 2x4
58
57
  variable += 100x80 % add
59
58
  variable -= 10x0 % subtract
60
59
  variable *= 3x4 % multiply
@@ -63,7 +62,7 @@ Size or point coordinates:
63
62
 
64
63
  Colors (red, blue, green & alpha in hexadecimal notation):
65
64
 
66
- variable = #C0FF33FF
65
+ variable = #C0FF33FF
67
66
  variable += #03003300 % add
68
67
  variable -= #0C240055 % subtract
69
68
  % variable is #B7DB66AA
@@ -133,6 +132,8 @@ compatible with the value's type.
133
132
  name = "zoom"
134
133
  %}
135
134
  duration = 400 % in ms (optional)
135
+ enter = :true % optional
136
+ leave = :true % optional
136
137
  }
137
138
  *Note: The animation is applied only to nested objects.*
138
139
 
@@ -244,6 +245,19 @@ Equivalent of the above example without using templates:
244
245
  \text title { height = 72; }
245
246
  }
246
247
 
248
+ ## Changelog
249
+
250
+ #### 0.1.1
251
+
252
+ - (un)load subsequent slides in background
253
+ - greatly reduced memory usage and startup time
254
+ - new 'enter' and 'leave' properties for `\animation`
255
+ - support template inheritance
256
+
257
+ ### 0.1
258
+
259
+ - First public release
260
+
247
261
  ## Contributing
248
262
 
249
263
  1. [Fork it](https://bitbucket.org/cfi30/slidefield/fork)
@@ -1,16 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- # This program is free software: you can redistribute it and/or modify
3
- # it under the terms of the GNU General Public License as published by
4
- # the Free Software Foundation, either version 3 of the License, or
5
- # (at your option) any later version.
6
- #
7
- # This program is distributed in the hope that it will be useful,
8
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
- # GNU General Public License for more details.
11
- #
12
- # You should have received a copy of the GNU General Public License
13
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
14
2
 
15
3
  require 'slidefield'
16
4
  require 'optparse'
@@ -27,6 +15,10 @@ def parse_opts
27
15
  options << :check
28
16
  end
29
17
 
18
+ opts.on '-d', '--debug', "Enable debug messages" do
19
+ options << :debug
20
+ end
21
+
30
22
  opts.on_tail '-v', '--version', "Show version number and copyright" do
31
23
  puts opts.ver
32
24
  puts <<GPL
@@ -61,11 +53,20 @@ begin
61
53
  raise SlideField::Error, e
62
54
  end
63
55
 
56
+ if options.include? :debug
57
+ SlideField.ondebug do |message|
58
+ puts message
59
+ end
60
+ end
61
+
64
62
  files = ARGV
65
63
 
66
64
  # read from standard input by default
67
65
  files << '-' if files.empty?
68
66
 
67
+ SlideField.debug "Options: #{options}"
68
+ SlideField.debug "File List: #{files}"
69
+
69
70
  files.each {|file|
70
71
  interpreter = SlideField::Interpreter.new
71
72
  if '-' == file
@@ -25,3 +25,13 @@ require 'slidefield/objects/rect.rb'
25
25
  require 'slidefield/objects/slide.rb'
26
26
  require 'slidefield/objects/song.rb'
27
27
  require 'slidefield/objects/text.rb'
28
+
29
+ module SlideField
30
+ def self.ondebug(&block)
31
+ @ondebug = block
32
+ end
33
+
34
+ def self.debug(message)
35
+ @ondebug[message] if @ondebug
36
+ end
37
+ end
@@ -1,6 +1,4 @@
1
1
  class SlideField::Animator
2
- attr_accessor :current, :forward
3
-
4
2
  def initialize(layout_size)
5
3
  @layout_size = layout_size
6
4
  reset
@@ -33,6 +31,11 @@ class SlideField::Animator
33
31
  # no animation
34
32
  return tr if anim.nil?
35
33
 
34
+ # direction disabled
35
+ cur_direction = @frame.forward? ? @frame.current? : !@frame.current?
36
+ dir_enabled = cur_direction ? anim.enter : anim.leave
37
+ anim.enabled = false unless dir_enabled
38
+
36
39
  elapsed = @frame.time - anim.start_time
37
40
  position = elapsed / anim.duration
38
41
  anim.enabled = false if position > 1.0
@@ -80,14 +83,16 @@ class SlideField::Animator
80
83
  def animation_for(data)
81
84
  return @animations[data] if @animations.has_key? data
82
85
 
83
- anim_struct = Struct.new :enabled, :start_time, :name, :duration
84
- anim = anim_struct.new false, 0.0, '', 0
86
+ anim_struct = Struct.new :enabled, :start_time, :name, :duration, :enter, :leave
87
+ anim = anim_struct.new false, 0.0, '', 0, true, true
85
88
 
86
89
  if data
87
90
  anim.enabled = true
88
91
  anim.start_time = @frame.time.to_f
89
92
  anim.name = data.get :name
90
93
  anim.duration = data.get :duration
94
+ anim.enter = data.get :enter
95
+ anim.leave = data.get :leave
91
96
  end
92
97
 
93
98
  @animations[data] = anim
@@ -2,8 +2,8 @@ class SlideField::Interpreter
2
2
  attr_accessor :root
3
3
 
4
4
  def initialize
5
- @parser = SlideField::Parser.new
6
5
  @files = []
6
+ @parser = SlideField::Parser.new
7
7
  @root = SlideField::ObjectData.new(:ROOT, 'line 0 char 0')
8
8
  end
9
9
 
@@ -31,6 +31,7 @@ class SlideField::Interpreter
31
31
  end
32
32
 
33
33
  def run_string(input, include_path = '.', context = 'input', parent_obj = nil)
34
+ SlideField.debug "Parsing #{context}..."
34
35
  include_path = File.absolute_path(include_path) + File::SEPARATOR
35
36
 
36
37
  object = parent_obj || @root
@@ -192,7 +193,7 @@ class SlideField::Interpreter
192
193
  value = copy
193
194
  when '*='
194
195
  multiplier = var_value.to_i
195
- if multiplier < 1
196
+ unless multiplier > 0
196
197
  raise SlideField::InterpreterError,
197
198
  "Invalid string multiplier '#{var_value}', integer > 0 required at #{get_loc var_value_t}"
198
199
  end
@@ -218,11 +219,15 @@ class SlideField::Interpreter
218
219
  def interpret_object(stmt_data, object, include_path, context)
219
220
  type_t = stmt_data[:type]
220
221
  type = type_t.to_sym
221
- value_data = stmt_data[:value]
222
- tpl_value_data = nil
223
222
  body = stmt_data[:body] || []
224
223
 
225
- if stmt_data[:template]
224
+ anon_values = []
225
+ anon_values << stmt_data[:value] if stmt_data[:value]
226
+
227
+ template_t = stmt_data[:template]
228
+ template = stmt_data
229
+
230
+ while template[:template]
226
231
  template = object.get type
227
232
  unless template
228
233
  raise SlideField::InterpreterError,
@@ -237,11 +242,12 @@ class SlideField::Interpreter
237
242
  type = template[:type].to_sym
238
243
 
239
244
  if template[:value]
240
- tpl_value_data = rebind_tokens template[:value], stmt_data[:template]
245
+ tpl_value = rebind_tokens template[:value], template_t
246
+ anon_values << tpl_value
241
247
  end
242
248
 
243
249
  if template[:body]
244
- tpl_body = rebind_tokens template[:body], stmt_data[:template]
250
+ tpl_body = rebind_tokens template[:body], template_t
245
251
  body += tpl_body
246
252
  end
247
253
  end
@@ -261,8 +267,9 @@ class SlideField::Interpreter
261
267
  raise "Unsupported object '#{child.type}'"
262
268
  end
263
269
 
264
- interpret_anon_value tpl_value_data, child if tpl_value_data
265
- interpret_anon_value value_data, child if value_data
270
+ anon_values.each {|value_data|
271
+ interpret_anon_value value_data, child
272
+ }
266
273
  interpret_tree body, child || [], include_path, context
267
274
 
268
275
  # process special objects
@@ -323,14 +330,6 @@ class SlideField::Interpreter
323
330
  end
324
331
  elsif type == :object
325
332
  token = token[:type]
326
-
327
- if value[:template]
328
- # we got something like `alias = \&template`
329
- # a template must be copied using the standard syntax `alias = template`
330
- # otherwise the reference would not be resolved
331
- raise SlideField::InterpreterError,
332
- "Unexpected template reference at #{get_loc token}"
333
- end
334
333
  end
335
334
 
336
335
  filters.reverse_each {|filter_token|
@@ -13,17 +13,24 @@ module SlideField::ObjectManager
13
13
  end
14
14
 
15
15
  def execute(event, *args)
16
- send event, *args
16
+ SlideField.debug "Event: #{event} (#{@obj.type} in #{@obj.context} at #{@obj.loc})"
17
+ send "on_#{event}", *args
17
18
  rescue => e
19
+ SlideField.debug "Backtrace: #{e.backtrace.join "\n"}"
18
20
  raise SlideField::RuntimeError,
19
21
  "#{@obj.context_string} An error occured while executing the '#{event}' event on the object '#{@obj.type}' at #{@obj.loc}:\n" +
20
22
  "\t(#{e.class}) #{e.message}"
21
23
  end
22
24
 
23
- def load; end
24
- def activate; end
25
- def draw(animator); end
26
- def deactivate; end
27
- def unload; end
25
+ def method_missing(method, *args)
26
+ raise NameError, "No such event" if method.to_s.start_with? 'on_'
27
+ execute method, *args
28
+ end
29
+
30
+ def on_load; end
31
+ def on_activate; end
32
+ def on_draw(animator); end
33
+ def on_deactivate; end
34
+ def on_unload; end
28
35
  end
29
36
  end
@@ -3,6 +3,8 @@ module SlideField::ObjectRules
3
3
  def rules
4
4
  property :name, :string
5
5
  property :duration, :integer, 400
6
+ property :enter, :boolean, true
7
+ property :leave, :boolean, true
6
8
 
7
9
  super
8
10
  end
@@ -12,7 +12,7 @@ end
12
12
 
13
13
  module SlideField::ObjectManager
14
14
  class Image < Base
15
- def load
15
+ def on_load
16
16
  @x, @y = @obj.get :position
17
17
  @z = @obj.get :z_order
18
18
  @color = Gosu::Color.rgba *@obj.get(:color)
@@ -28,7 +28,7 @@ module SlideField::ObjectManager
28
28
  @y_scale = height / @image.height.to_f
29
29
  end
30
30
 
31
- def draw(animator)
31
+ def on_draw(animator)
32
32
  tr = animator.transform @obj
33
33
  return if tr.skip_draw?
34
34
 
@@ -43,5 +43,9 @@ module SlideField::ObjectManager
43
43
 
44
44
  @image.draw x, y, @z, x_scale, y_scale, color
45
45
  end
46
+
47
+ def on_unload
48
+ @image = nil
49
+ end
46
50
  end
47
51
  end
@@ -11,7 +11,7 @@ end
11
11
 
12
12
  module SlideField::ObjectManager
13
13
  class Rect < Base
14
- def load
14
+ def on_load
15
15
  @x, @y = @obj.get :position
16
16
  @z = @obj.get :z_order
17
17
 
@@ -19,7 +19,7 @@ module SlideField::ObjectManager
19
19
  @fill = Gosu::Color.rgba *@obj.get(:fill)
20
20
  end
21
21
 
22
- def draw(animator)
22
+ def on_draw(animator)
23
23
  tr = animator.transform @obj
24
24
  return if tr.skip_draw?
25
25
 
@@ -4,26 +4,32 @@ end
4
4
 
5
5
  module SlideField::ObjectManager
6
6
  class Slide < Base
7
- def load
7
+ def loaded?
8
+ @is_loaded
9
+ end
10
+
11
+ def on_load
12
+ @is_loaded = true
8
13
  @children = []
9
14
  add_children_of @obj
10
15
 
11
16
  forward :load
12
17
  end
13
18
 
14
- def activate
19
+ def on_activate
15
20
  forward :activate
16
21
  end
17
22
 
18
- def draw(animator)
23
+ def on_draw(animator)
19
24
  forward :draw, animator
20
25
  end
21
26
 
22
- def deactivate
27
+ def on_deactivate
23
28
  forward :deactivate
24
29
  end
25
30
 
26
- def unload
31
+ def on_unload
32
+ @is_loaded = false
27
33
  forward :unload
28
34
  end
29
35
 
@@ -12,7 +12,7 @@ end
12
12
 
13
13
  module SlideField::ObjectManager
14
14
  class Song < Base
15
- def load
15
+ def on_load
16
16
  source = File.expand_path @obj.get(:source), @obj.include_path
17
17
  @loop = @obj.get(:loop)
18
18
  @volume = @obj.get(:volume) / 100.0
@@ -20,12 +20,17 @@ module SlideField::ObjectManager
20
20
  @song = Gosu::Sample.new @window, source
21
21
  end
22
22
 
23
- def activate
23
+ def on_activate
24
24
  @instance = @song.play @volume, 1, @loop
25
25
  end
26
26
 
27
- def deactivate
27
+ def on_deactivate
28
28
  @instance.stop
29
+ @instance = nil
30
+ end
31
+
32
+ def on_unload
33
+ @song = nil
29
34
  end
30
35
  end
31
36
  end
@@ -16,7 +16,7 @@ end
16
16
 
17
17
  module SlideField::ObjectManager
18
18
  class Text < Base
19
- def load
19
+ def on_load
20
20
  @x, @y = @obj.get :position
21
21
  @z = @obj.get :z_order
22
22
  @color = Gosu::Color.rgba *@obj.get(:color)
@@ -41,7 +41,7 @@ module SlideField::ObjectManager
41
41
  @image = Gosu::Image.from_text @window, content, font, height, spacing, width, align
42
42
  end
43
43
 
44
- def draw(animator)
44
+ def on_draw(animator)
45
45
  tr = animator.transform @obj
46
46
  return if tr.skip_draw?
47
47
 
@@ -53,5 +53,9 @@ module SlideField::ObjectManager
53
53
 
54
54
  @image.draw x, y, @z, tr.scale, tr.scale, color
55
55
  end
56
+
57
+ def on_unload
58
+ @image = nil
59
+ end
56
60
  end
57
61
  end
@@ -1,3 +1,3 @@
1
1
  module SlideField
2
- VERSION = "0.1"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -1,4 +1,8 @@
1
1
  class SlideField::Viewer < Gosu::Window
2
+ # preloader settings
3
+ LOAD_AROUND = 4
4
+ LOAD_DELAY = 1000
5
+
2
6
  def initialize(project)
3
7
  layout = project[:layout].first
4
8
  layout_size = layout.get :size
@@ -6,12 +10,12 @@ class SlideField::Viewer < Gosu::Window
6
10
 
7
11
  super *layout_size, fullscreen
8
12
 
13
+ @time = 0
9
14
  @animator = SlideField::Animator.new layout_size
10
15
 
11
16
  @slides = []
12
17
  project[:slide].each {|slide_data|
13
18
  manager = SlideField::ObjectManager.new slide_data, self
14
- manager.load
15
19
  @slides << manager
16
20
  }
17
21
 
@@ -19,20 +23,32 @@ class SlideField::Viewer < Gosu::Window
19
23
  end
20
24
 
21
25
  def update
22
- @time = Gosu::milliseconds
23
- end
26
+ now = Gosu::milliseconds
24
27
 
25
- def draw
26
- @animator.frame @time, true, @forward do
27
- @slides[@current].draw @animator
28
+ unless needs_redraw?
29
+ if now - @time > LOAD_DELAY && @can_preload
30
+ smart_loader
31
+ @can_preload = false
32
+ end
33
+
34
+ return
28
35
  end
29
36
 
37
+ @time = now
38
+ @can_preload = true
39
+ end
40
+
41
+ def draw
30
42
  # animate the previous slide
31
43
  if @previous && @animator.need_redraw?
32
44
  @animator.frame @time, false, @forward do
33
45
  @slides[@previous].draw @animator
34
46
  end
35
47
  end
48
+
49
+ @animator.frame @time, true, @forward do
50
+ @slides[@current].draw @animator
51
+ end
36
52
  end
37
53
 
38
54
  def needs_redraw?
@@ -68,7 +84,6 @@ class SlideField::Viewer < Gosu::Window
68
84
  end
69
85
  end
70
86
 
71
- private
72
87
  def change_slide(index)
73
88
  return if @current == index || index < 0 || index > @slides.length-1
74
89
 
@@ -82,8 +97,30 @@ class SlideField::Viewer < Gosu::Window
82
97
  @forward = true
83
98
  end
84
99
 
100
+ @slides[@current].load unless @slides[@current].loaded?
85
101
  @slides[@current].activate
86
-
87
102
  @animator.reset
88
103
  end
104
+
105
+ private
106
+ def smart_loader
107
+ SlideField.debug "(Un)loading resources..."
108
+
109
+ ahead = LOAD_AROUND / 2
110
+ behind = -ahead
111
+
112
+ @slides.each_with_index {|manager, index|
113
+ rel_index = index - @current
114
+ keep = rel_index >= behind && rel_index <= ahead
115
+
116
+ if keep && !manager.loaded?
117
+ manager.load
118
+ elsif !keep && manager.loaded?
119
+ manager.unload
120
+ end
121
+ }
122
+
123
+ # really unload resources
124
+ GC.start
125
+ end
89
126
  end
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["cfi30"]
10
10
  spec.email = ["slidefield@cfillion.tk"]
11
11
  spec.summary = %q{A presentation software that reads plain text files written in its own interpreted language.}
12
- spec.homepage = ""
12
+ spec.homepage = "https://bitbucket.org/cfi30/slidefield"
13
13
  spec.license = "GPL"
14
14
 
15
15
  spec.files = `git ls-files -z`.split "\x0"
@@ -6,19 +6,21 @@ class TestAnimator < MiniTest::Test
6
6
  @assert_number = 0
7
7
  end
8
8
 
9
- def get_object(anim_name, duration)
9
+ def get_object(anim_name, duration, enter = true, leave = true)
10
10
 
11
11
  a = SlideField::ObjectData.new :animation, 'animation loc'
12
12
  a.set :name, anim_name, 'name loc', :string
13
13
  a.set :duration, duration, 'duration loc', :integer
14
+ a.set :enter, enter, 'enter loc', :boolean
15
+ a.set :leave, leave, 'leave loc', :boolean
14
16
 
15
17
  obj = SlideField::ObjectData.new :object, 'object loc'
16
18
  a << obj
17
19
  obj
18
20
  end
19
21
 
20
- def assert_animation(anim_name, duration, tests)
21
- obj = get_object anim_name, duration
22
+ def assert_animation(anim_name, duration, tests, enter = true, leave = true, need_redraw = true)
23
+ obj = get_object anim_name, duration, enter, leave
22
24
  tests.each_with_index {|test, index|
23
25
  time, current, forward, assertions = test
24
26
 
@@ -30,7 +32,7 @@ class TestAnimator < MiniTest::Test
30
32
  }
31
33
  end
32
34
 
33
- assert @animator.need_redraw?,
35
+ assert_equal need_redraw, @animator.need_redraw?,
34
36
  "animator.need_redraw? in test #{index + 1}"
35
37
  }
36
38
  end
@@ -241,4 +243,36 @@ class TestAnimator < MiniTest::Test
241
243
  [100, false, nil, {:scale=>0.0}],
242
244
  ]
243
245
  end
246
+
247
+ def test_enter_disabled_forward
248
+ assert_animation 'fade', 100, [
249
+ [0, true, true, {:opacity=>1.0}],
250
+ [50, true, true, {:opacity=>1.0}],
251
+ [100, true, true, {:opacity=>1.0}],
252
+ ], false, true, false
253
+ end
254
+
255
+ def test_enter_disabled_backward
256
+ assert_animation 'fade', 100, [
257
+ [0, false, false, {:opacity=>1.0}],
258
+ [50, false, false, {:opacity=>1.0}],
259
+ [100, false, false, {:opacity=>1.0}],
260
+ ], false, true, false
261
+ end
262
+
263
+ def test_leave_disabled_forward
264
+ assert_animation 'fade', 100, [
265
+ [0, false, true, {:opacity=>1.0}],
266
+ [50, false, true, {:opacity=>1.0}],
267
+ [100, false, true, {:opacity=>1.0}],
268
+ ], true, false, false
269
+ end
270
+
271
+ def test_leave_disabled_backward
272
+ assert_animation 'fade', 100, [
273
+ [0, true, false, {:opacity=>1.0}],
274
+ [50, true, false, {:opacity=>1.0}],
275
+ [100, true, false, {:opacity=>1.0}],
276
+ ], true, false, false
277
+ end
244
278
  end
@@ -22,6 +22,7 @@ module SlideField::ObjectRules
22
22
  def rules
23
23
  property :num, :integer, 0
24
24
  property :num2, :integer, 0
25
+ property :bool, :boolean, false
25
26
  property :str, :string, ""
26
27
  end
27
28
  end
@@ -47,8 +48,10 @@ class TestInterpreter < MiniTest::Test
47
48
  @col_cache[line] = 0 unless @col_cache[line]
48
49
  col = @col_cache[line] += 1
49
50
 
50
- line_cache = MiniTest::Mock.new
51
- line_cache.expect :line_and_column, [line, col], [Object]
51
+ line_cache = Class.new
52
+ line_cache.define_singleton_method :line_and_column do |pos|
53
+ [line, col]
54
+ end
52
55
 
53
56
  pos = Parslet::Position.new val, 0
54
57
  Parslet::Slice.new pos, val, line_cache
@@ -1087,7 +1090,7 @@ class TestInterpreter < MiniTest::Test
1087
1090
  @interpreter.interpret_tree tokens, o
1088
1091
  end
1089
1092
 
1090
- assert_equal "Unexpected 'point', expecting one of [:integer, :string] at line 1 char 2", error.message
1093
+ assert_equal "Unexpected 'point', expecting one of [:integer, :boolean, :string] at line 1 char 2", error.message
1091
1094
  end
1092
1095
 
1093
1096
  def test_unknown_object
@@ -1396,7 +1399,7 @@ class TestInterpreter < MiniTest::Test
1396
1399
  @interpreter.interpret_tree tokens, o
1397
1400
  end
1398
1401
 
1399
- assert_equal "Variable 'num' is already defined at line 2 char 3", error.message
1402
+ assert_equal "Variable 'num' is already defined at line 2 char 1", error.message
1400
1403
  end
1401
1404
 
1402
1405
  def test_template_of_template
@@ -1413,13 +1416,57 @@ class TestInterpreter < MiniTest::Test
1413
1416
  ]
1414
1417
 
1415
1418
  o = SlideField::ObjectData.new :parent, 'loc'
1416
- o.set :template, {:type=>slice('child', 2)}, 'loc', :object
1419
+ o.set :template, {:type=>slice('child', 3)}, 'loc', :object
1417
1420
 
1418
- error = assert_raises SlideField::InterpreterError do
1419
- @interpreter.interpret_tree tokens, o
1420
- end
1421
+ @interpreter.interpret_tree tokens, o
1422
+
1423
+ assert_equal 1, o[:child].count
1424
+ assert_equal 'line 2 char 2', o[:child].first.loc
1425
+ end
1426
+
1427
+ def test_template_triple_value
1428
+ template = {
1429
+ :type=>slice('value', 1),
1430
+ :value=>{:filters=>[], :integer=>slice('42', 1)}
1431
+ }
1432
+
1433
+ tokens = [
1434
+ {:assignment=>{
1435
+ :variable=>slice('alias', 2),
1436
+ :operator=>slice('=', 2),
1437
+ :value=>{
1438
+ :filters=>[],
1439
+ :object=>{
1440
+ :template=>slice('&', 2),
1441
+ :value=>{:filters=>[], :string=>slice('"test"', 2)},
1442
+ :type=>slice('template', 2)
1443
+ }
1444
+ }
1445
+ }},
1446
+ {:object=>{
1447
+ :template=>slice('&', 3),
1448
+ :value=>{:filters=>[], :boolean=>slice(':true', 3)},
1449
+ :type=>slice('alias', 3)}
1450
+ }
1451
+ ]
1452
+
1453
+ o = SlideField::ObjectData.new :parent, 'loc'
1454
+ o.set :template, template, 'loc', :object
1455
+
1456
+ @interpreter.interpret_tree tokens, o
1457
+ copy = o[:value].first
1458
+
1459
+ assert_equal 42, copy.get(:num)
1460
+ assert_equal :integer, copy.var_type(:num)
1461
+ assert_equal 'line 3 char 1', copy.var_loc(:num)
1462
+
1463
+ assert_equal 'test', copy.get(:str)
1464
+ assert_equal :string, copy.var_type(:str)
1465
+ assert_equal 'line 3 char 1', copy.var_loc(:str)
1421
1466
 
1422
- assert_equal "Unexpected template reference at line 1 char 4", error.message
1467
+ assert_equal true, copy.get(:bool)
1468
+ assert_equal :boolean, copy.var_type(:bool)
1469
+ assert_equal 'line 3 char 2', copy.var_loc(:bool)
1423
1470
  end
1424
1471
 
1425
1472
  def test_undefined_template
@@ -2,7 +2,7 @@ require File.expand_path '../helper', __FILE__
2
2
 
3
3
  module SlideField::ObjectManager
4
4
  class CatchTest < Base
5
- def load(what)
5
+ def on_load(what)
6
6
  raise what
7
7
  end
8
8
  end
@@ -40,9 +40,21 @@ class TestObjectManager < MiniTest::Test
40
40
 
41
41
  manager = SlideField::ObjectManager.new obj, nil
42
42
  error = assert_raises SlideField::RuntimeError do
43
- manager.execute :load, 'error message'
43
+ manager.load 'error message'
44
44
  end
45
45
 
46
46
  assert_equal "[context] An error occured while executing the 'load' event on the object 'catchTest' at loc:\n\t(RuntimeError) error message", error.message
47
47
  end
48
+
49
+ def test_unknown_event
50
+ obj = SlideField::ObjectData.new :catchTest, 'loc'
51
+ obj.context = 'context'
52
+
53
+ manager = SlideField::ObjectManager.new obj, nil
54
+ error = assert_raises NameError do
55
+ manager.on_jump
56
+ end
57
+
58
+ assert_equal "No such event", error.message
59
+ end
48
60
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slidefield
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - cfi30
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-02 00:00:00.000000000 Z
11
+ date: 2014-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -156,7 +156,7 @@ files:
156
156
  - test/test_object_manager.rb
157
157
  - test/test_object_rules.rb
158
158
  - test/test_parser.rb
159
- homepage: ''
159
+ homepage: https://bitbucket.org/cfi30/slidefield
160
160
  licenses:
161
161
  - GPL
162
162
  metadata: {}