slidefield 0.1 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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: {}