swxruby 0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/CHANGELOG +21 -0
  2. data/LICENSE +20 -0
  3. data/README +143 -0
  4. data/Rakefile +111 -0
  5. data/bin/swxruby +58 -0
  6. data/examples/standalone/standalone.fla +0 -0
  7. data/examples/standalone/standalone.rb +37 -0
  8. data/examples/standalone/standalone.swf +0 -0
  9. data/init.rb +22 -0
  10. data/install.rb +69 -0
  11. data/lib/swxruby.rb +6 -0
  12. data/lib/swxruby/bytecode_converter.rb +139 -0
  13. data/lib/swxruby/core_extensions.rb +41 -0
  14. data/lib/swxruby/helper_module.rb +72 -0
  15. data/lib/swxruby/rails_integration/render_decorator.rb +20 -0
  16. data/lib/swxruby/rails_integration/swx.yml +18 -0
  17. data/lib/swxruby/rails_integration/swx_controller.rb +6 -0
  18. data/lib/swxruby/services/arithmetic.rb +9 -0
  19. data/lib/swxruby/services/discovery_service.rb +3 -0
  20. data/lib/swxruby/services/hello_world.rb +7 -0
  21. data/lib/swxruby/services/simple.rb +5 -0
  22. data/lib/swxruby/services/test_data_types.rb +94 -0
  23. data/lib/swxruby/swx_assembler.rb +138 -0
  24. data/lib/swxruby/swx_gateway.rb +104 -0
  25. data/lib/swxruby/version.rb +9 -0
  26. data/spec/spec.opts +1 -0
  27. data/spec/spec_helper.rb +6 -0
  28. data/spec/swxruby/bytecode_converter_spec.rb +162 -0
  29. data/spec/swxruby/core_extensions_spec.rb +16 -0
  30. data/spec/swxruby/fixtures/number_one_no_debug_compression_4.swx +0 -0
  31. data/spec/swxruby/fixtures/number_one_no_debug_no_compression.swx +0 -0
  32. data/spec/swxruby/fixtures/number_one_no_debug_no_compression_arbitrary_allow_domain.swx +0 -0
  33. data/spec/swxruby/fixtures/number_one_with_debug_compression_4.swx +0 -0
  34. data/spec/swxruby/fixtures/number_one_with_debug_no_compression.swx +0 -0
  35. data/spec/swxruby/rails_integration/init_spec.rb +0 -0
  36. data/spec/swxruby/rails_integration/render_decorator_spec.rb +73 -0
  37. data/spec/swxruby/rails_integration/swx_controller_spec.rb +5 -0
  38. data/spec/swxruby/swx_assembler_spec.rb +60 -0
  39. data/spec/swxruby/swx_gateway_spec.rb +160 -0
  40. metadata +108 -0
@@ -0,0 +1,104 @@
1
+ require 'json'
2
+ require 'swx_assembler'
3
+
4
+ # Create a namespace (sandbox) for SWX service classes; ensures we don't get
5
+ # any bored twelve year-olds trying to call Kernel#system using our gateway
6
+ # (they would instead be calling SwxServiceClasses::Kernel#system)
7
+ module SwxServiceClasses; end
8
+
9
+ class SwxGateway
10
+ class << self
11
+ attr_accessor :app_root, :swx_config
12
+
13
+ # Eval all files in the services_path into the SwxServiceClasses namespace
14
+ def init_service_classes
15
+ Dir.glob(File.join(app_root, swx_config['services_path'], './**/*.rb')) do |filename|
16
+ # Load service class into SwxServiceClasses namespace.
17
+ SwxServiceClasses.module_eval(File.read(filename))
18
+ end
19
+ true
20
+ end
21
+
22
+ # Convert strings containing 'null' to nil. Null in Flash is equivalent to nil in Ruby.
23
+ def nillify_nulls(args_array)
24
+ # Convert all strings containing 'null' to nil
25
+ args_array.collect! { |arg| if arg == 'null' then nil else arg end }
26
+ # Return nil if the args array contained only 'null' strings
27
+ if args_array.compact.empty? then nil else args_array end
28
+ end
29
+
30
+ # The entry point for SWX request processing. Takes a hash of +params+ and goes to work generating SWX bytecode.
31
+ #
32
+ # Special note: Contrary to Ruby convention, keys in the +params+ hash are camelCase (instead of underscored). This
33
+ # is to maintain compatibility with the SWX AS library which sends request parameters
34
+ # using camelCase (ActionScript's variable naming convention).
35
+ #
36
+ # ==== Params
37
+ # * <tt>:args</tt> -- JSON string of arguments (converted to a Ruby object and passed to the specified method of the service class)
38
+ # * <tt>:debug</tt> -- Boolean. If set to true, the generated SWX file will attempt to establish a local connection the SWX Analyzer when opened in Flash Player.
39
+ # * <tt>:method</tt> -- specifies the method to be called on the service class. May be either camelCased or underscored (camelCased will be converted to underscored before being called on the service class)
40
+ # * <tt>:serviceClass</tt> -- specifies the service class
41
+ # * <tt>:url</tt> -- (optional) the url of the SWF file making this request. Added to the generated SWX file to skirt cross-domain issues. If not specified, the resulting SWX file allow access from any domain
42
+ #
43
+ # ==== Examples
44
+ # SwxGateway.process(:args => 'Hello World!', :debug => true, :method => 'echo_data', :serviceClass => 'Simple', :url => 'http://myfunkysite/swxconsumer.swf')
45
+ # # => A binary string of SWX bytecode containing the result of +Simple.new#echo_data('Hello World!')+; debugging enabled and allowing access from the specified url
46
+ #
47
+ # SwxGateway.process(:args => 'Hello World!', :debug => true, :method => 'echo_data', :serviceClass => 'Simple')
48
+ # # => Same as previous, except allows access from any url
49
+ #
50
+ # SwxGateway.process(:args => [1,2], :debug => false, :method => 'addNumbers', :serviceClass => 'Simple', :url => 'http://myfunkysite/swxconsumer.swf')
51
+ # # calls params[:method].underscore
52
+ # # => A binary string of SWX bytecode containing the result of +Simple.new#add_numbers(1, 2)+; no debugging and allowing access from the specified url
53
+ def process(params)
54
+ # Set defaults if the SWX gateway isn't configured
55
+ swx_config ||= {'compression_level' => 4, 'allow_domain' => true}
56
+
57
+ # convert JSON arguments to a Ruby object
58
+ args = json_to_ruby params[:args]
59
+
60
+ unless args.nil?
61
+ # Ensure that none of the arguments contain 'undefined'
62
+ raise ArgumentError, "The request contained undefined args.\n serviceClass: #{params[:serviceClass]}\n method: #{params[:method]}\n args: #{args.join(', ')}" if args.any? { |argument| argument == 'undefined' }
63
+ # Convert 'null' strings in args array to nil
64
+ args = nillify_nulls(args)
65
+ end
66
+
67
+ # Fetch the class constant for the specified service class
68
+ validate_service_class_name(params[:serviceClass])
69
+ service_class = class_eval("SwxServiceClasses::#{params[:serviceClass]}")
70
+
71
+ # convert camelCased params[:method] to underscored (does nothing if params[:method] is already underscored)
72
+ # This effectively bridges the gap between ActionScript and Ruby variable/method naming conventions.
73
+ params[:method] = params[:method].underscore
74
+
75
+ # Prevent nefarious use of methods that the service class inherited from Object
76
+ raise NoMethodError unless (service_class.public_instance_methods - Object.public_instance_methods).include?(params[:method])
77
+
78
+ # Instantiate the service class, call the specified method, and capture the response
79
+ service_class_response = if args.nil?
80
+ # No args were passed, so assume the service class' method doesn't take any arguments
81
+ service_class.new.send(params[:method])
82
+ else
83
+ # Call the service class' method and pass in the arguments (uses an * to pass an array as multiple arguments)
84
+ service_class.new.send(params[:method], *args)
85
+ end
86
+
87
+ # convert 'true' and 'false' to real booleans
88
+ debug_param = params[:debug] == 'true' ? true : false
89
+
90
+ # assemble and return swx file
91
+ SwxAssembler.write_swf(service_class_response, debug_param, swx_config['compression_level'], params[:url], swx_config['allow_domain'])
92
+ end
93
+
94
+ def json_to_ruby(arguments) #:nodoc:
95
+ JSON.parse arguments unless arguments.nil? || arguments.empty?
96
+ end
97
+
98
+ def validate_service_class_name(service_class) #:nodoc:
99
+ unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ service_class
100
+ raise NameError, "#{service_class.inspect} is not a valid constant name!"
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,9 @@
1
+ module Swxruby #:nodoc:
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 7
5
+ TINY = 0
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,6 @@
1
+ require 'rubygems'
2
+ gem 'rspec'
3
+ require 'spec'
4
+
5
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib', 'swxruby')
6
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib', 'swxruby', 'services')
@@ -0,0 +1,162 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ require 'active_record'
4
+ require 'bytecode_converter'
5
+ require 'date'
6
+
7
+ describe BytecodeConverter, 'in regard to arrays' do
8
+ it 'should convert an array of integers to bytecode' do
9
+ BytecodeConverter.convert([1, 2, 3]).should == '961400070300000007020000000701000000070300000042'
10
+ end
11
+
12
+ it 'should convert an array containing nil values to bytecode' do
13
+ BytecodeConverter.convert([1, nil, 3]).should == '9610000703000000020701000000070300000042'
14
+ end
15
+
16
+ it %q(should convert an array of strings to bytecode) do
17
+ BytecodeConverter.convert(['one', 'two', 'three']).should == '961600007468726565000074776F00006F6E6500070300000042'
18
+ end
19
+
20
+ it %q(should convert an array of mixed datatypes to bytecode) do
21
+ BytecodeConverter.convert([1, 'two', 3.5]).should == '9618000600000C40000000000074776F000701000000070300000042'
22
+ end
23
+
24
+ it %q(should convert nested arrays to bytecode) do
25
+ BytecodeConverter.convert([1, ['two', 3.5]]).should == '9613000600000C40000000000074776F00070200000042960A000701000000070200000042'
26
+ end
27
+
28
+ it %q(should convert more nested arrays to bytecode) do
29
+ BytecodeConverter.convert([[1], 'two', 3.5]).should == '960E000600000C40000000000074776F00960A000701000000070100000042960500070300000042'
30
+ end
31
+
32
+ it %q(should convert an array with nested hashes to bytecode) do
33
+ BytecodeConverter.convert([1, {'number' => 2}, 3]).should == '9605000703000000961200006E756D626572000702000000070100000043960A000701000000070300000042'
34
+ end
35
+
36
+ it %q(should convert an array with nested hashes with nested arrays to bytecode) do
37
+ BytecodeConverter.convert([1, {'numbers' => [{'two' => 2}, {'three' => 3}]}, 4]).should == '9605000704000000960900006E756D6265727300961100007468726565000703000000070100000043960F000074776F000702000000070100000043960500070200000042960500070100000043960A000701000000070300000042'
38
+ end
39
+ end
40
+
41
+ describe BytecodeConverter, 'in regard to booleans' do
42
+ it 'should convert "true" to bytecode' do
43
+ BytecodeConverter.convert(true).should == '0501'
44
+ end
45
+
46
+ it 'should convert "false" to bytecode' do
47
+ BytecodeConverter.convert(false).should == '0500'
48
+ end
49
+ end
50
+
51
+ describe BytecodeConverter, 'in regard to custom classes' do
52
+ it 'should convert the class to a hash by calling CustomClass#instance_values' do
53
+ @custom_class = mock('MyCustomClass')
54
+ # BytecodeConverter.should_receive(:convert).with(@custom_class)
55
+ @custom_class.should_receive(:instance_values).and_return({'it' => 'works'})
56
+ # BytecodeConverter.should_receive(:convert).with({'it' => 'works'})
57
+
58
+ BytecodeConverter.convert(@custom_class)
59
+ end
60
+ end
61
+
62
+ describe BytecodeConverter, 'in regard to datetimes' do
63
+ it 'should convert a datetime to a string and pass it to BytecodeConverter#string_to_bytecode' do
64
+ BytecodeConverter.should_receive(:string_to_bytecode).with(an_instance_of(String))
65
+ BytecodeConverter.convert(DateTime.new(2007, 9, 9, 12, 30))
66
+ end
67
+ end
68
+
69
+ describe BytecodeConverter, 'in regard to dates' do
70
+ it 'should convert a date to a string and pass it to BytecodeConverter#string_to_bytecode' do
71
+ BytecodeConverter.should_receive(:string_to_bytecode).with(an_instance_of(String))
72
+ BytecodeConverter.convert(Date.new(2007, 9, 9))
73
+ end
74
+ end
75
+
76
+ describe BytecodeConverter, 'in regard to floats' do
77
+ it 'should convert negative floats to bytecode' do
78
+ BytecodeConverter.convert(-0.123456789).should == '06DD9ABFBF5F633937'
79
+ end
80
+
81
+ it 'should convert floats to bytecode' do
82
+ BytecodeConverter.convert(1.2).should == '063333F33F33333333'
83
+ end
84
+ end
85
+
86
+ describe BytecodeConverter, 'in regard to hashes' do
87
+ it %q[should convert a hash with string and integer values to bytecode] do
88
+ BytecodeConverter.convert({'it' => 'works', 'number' => 42}).should == '961D00006E756D62657200072A0000000069740000776F726B7300070200000043'
89
+ end
90
+
91
+ it %q[should convert a hash with symbols for keys to bytecode] do
92
+ BytecodeConverter.convert({:it => 'works', :number => 42}).should == '961D00006E756D62657200072A0000000069740000776F726B7300070200000043'
93
+ end
94
+
95
+ it %q[should convert a hash with nested arrays to bytecode] do
96
+ BytecodeConverter.convert({'they' => ['really', 'work'], 'numbers' => [1, 2, 3]}).should == '960900006E756D626572730096140007030000000702000000070100000007030000004296060000746865790096130000776F726B00007265616C6C7900070200000042960500070200000043'
97
+ end
98
+
99
+ it 'should convert a hash containing nil values to bytecode' do
100
+ BytecodeConverter.convert({'hello' => nil}).should == '960D000068656C6C6F0002070100000043'
101
+ end
102
+ end
103
+
104
+ describe BytecodeConverter, 'in regard to integers' do
105
+ it 'should convert "0" to bytecode' do
106
+ BytecodeConverter.convert(0).should == '0700000000'
107
+ end
108
+
109
+ it 'should convert "1" to bytecode' do
110
+ BytecodeConverter.convert(1).should == '0701000000'
111
+ end
112
+
113
+ it 'should convert "900" to bytecode' do
114
+ BytecodeConverter.convert(900).should == '0784030000'
115
+ end
116
+
117
+ it 'should convert "16711680" to bytecode' do
118
+ BytecodeConverter.convert(16711680).should == '070000FF00'
119
+ end
120
+
121
+ it 'should convert "4294967295" to bytecode' do
122
+ BytecodeConverter.convert(4294967295).should == '07FFFFFFFF'
123
+ end
124
+ end
125
+
126
+ describe BytecodeConverter, 'in regard to nil' do
127
+ it 'should convert "nil" to bytecode' do
128
+ BytecodeConverter.convert(nil).should == '02'
129
+ end
130
+ end
131
+
132
+ describe BytecodeConverter, 'in regard to strings' do
133
+ it 'should convert "hello" to bytecode' do
134
+ BytecodeConverter.convert('hello').should == '0068656C6C6F00'
135
+ end
136
+
137
+ it 'should convert "goodbye" to bytecode' do
138
+ BytecodeConverter.convert('goodbye').should == '00676F6F6462796500'
139
+ end
140
+
141
+ it 'should convert an empty string to bytecode' do
142
+ BytecodeConverter.convert('').should == '0000'
143
+ end
144
+ end
145
+
146
+ describe BytecodeConverter, 'in regard to symbols' do
147
+ it 'should convert :hello to bytecode' do
148
+ BytecodeConverter.convert(:hello).should == '0068656C6C6F00'
149
+ end
150
+
151
+ it 'should convert :goodbye to bytecode' do
152
+ BytecodeConverter.convert(:goodbye).should == '00676F6F6462796500'
153
+ end
154
+ end
155
+
156
+
157
+
158
+ describe BytecodeConverter, 'in regard to unhandled datatypes' do
159
+ it 'should raise an exception when asked to convert an unhandled data type' do
160
+ lambda { BytecodeConverter.convert(/^What about (me)?$/) }.should raise_error(StandardError)
161
+ end
162
+ end
@@ -0,0 +1,16 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+ require 'core_extensions'
3
+
4
+ class MyClass
5
+ def initialize
6
+ @foo = 'foo'
7
+ @bar = 'bar'
8
+ end
9
+ end
10
+
11
+ describe 'Object extensions' do
12
+ it '#instance_values should convert an object\'s instance variables to a hash' do
13
+ MyClass.new.instance_values.should be_an_instance_of(Hash)
14
+ MyClass.new.instance_values.sort_by { |key, value| value }.should == [['bar', 'bar'], ['foo', 'foo']]
15
+ end
16
+ end
@@ -0,0 +1,73 @@
1
+ RSPEC_ON_RAILS_FILE = File.expand_path(File.dirname(__FILE__) + "../../../rspec_on_rails/lib/spec/rails.rb")
2
+ RAILS_ROOT = File.expand_path(File.dirname(__FILE__) + "../../../../../")
3
+
4
+ if File.exist?(RSPEC_ON_RAILS_FILE)
5
+ ENV["RAILS_ENV"] = "test"
6
+ require RAILS_ROOT + "/config/environment"
7
+ require RSPEC_ON_RAILS_FILE
8
+
9
+ Spec::Runner.configure do |config|
10
+ config.use_transactional_fixtures = false
11
+ config.use_instantiated_fixtures = false
12
+ config.fixture_path = RAILS_ROOT + '/spec/fixtures'
13
+
14
+ # You can declare fixtures for each behaviour like this:
15
+ # describe "...." do
16
+ # fixtures :table_a, :table_b
17
+ #
18
+ # Alternatively, if you prefer to declare them only once, you can
19
+ # do so here, like so ...
20
+ #
21
+ # config.global_fixtures = :table_a, :table_b
22
+ #
23
+ # If you declare global fixtures, be aware that they will be declared
24
+ # for all of your examples, even those that don't use them.
25
+ end
26
+
27
+
28
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib', 'rails_integration')
29
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
30
+ require 'rubygems'
31
+ require 'spec/runner'
32
+
33
+ require 'render_decorator'
34
+ require 'swx_gateway'
35
+
36
+ describe 'Render decorator\'s effect on Rails\' vanilla render method' do
37
+ it 'should alias ActionController::Base#render as render_with_swx' do
38
+ ActionController::Base.new.should respond_to(:render_with_swx)
39
+ end
40
+
41
+ it 'should create ActionController::Base#render_without_swx' do
42
+ ActionController::Base.new.should respond_to(:render_without_swx)
43
+ end
44
+ end
45
+
46
+ describe '#render_with_swx' do
47
+ before do
48
+ @controller = ActionController::Base.new
49
+ @controller.stub!(:params).and_return(:debug => 'true', :url => '')
50
+ @controller.stub!(:send_data)
51
+ SwxAssembler.stub!(:write_swf).and_return('swx bytecode')
52
+ end
53
+
54
+ it 'should delegate calls that don\'t contain a :swx key to #render_without_swx' do
55
+ @controller.should_receive(:render_without_swx)
56
+ @controller.render(:text => 'not a swx request')
57
+ end
58
+
59
+ it 'should utilize SwxAssembler to generate the SWX bytecode' do
60
+ SwxAssembler.should_receive(:write_swf).with('Jeremiah was a bullfrog.', 'true', SwxGateway.swx_config['compression_level'], '', SwxGateway.swx_config['allow_domain'])
61
+ @controller.render(:swx => 'Jeremiah was a bullfrog.')
62
+ end
63
+
64
+ it 'should stream the generated SWX bytecode back to the user' do
65
+ @controller.should_receive(:send_data).with('swx bytecode', :type => 'application/swf', :filename => 'data.swf')
66
+ @controller.render(:swx => 'some data')
67
+ end
68
+ end
69
+ else
70
+ puts 'Not installed as Rails plugin. Skipping Rails integration specifications.'
71
+ end
72
+
73
+
@@ -0,0 +1,5 @@
1
+ describe 'Rails SwxController' do
2
+ it 'should provide a #gateway action to handle SWX requests' do
3
+ pending(%q{It's implemented, just not specified yet.})
4
+ end
5
+ end
@@ -0,0 +1,60 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ require 'swx_assembler'
4
+
5
+ describe SwxAssembler do
6
+ it 'should assemble a swx file without debugging and without compression' do
7
+ BytecodeConverter.should_receive(:convert).with(1).once.and_return('0701000000')
8
+ SwxAssembler.write_swf(1, false, 0).should == File.read(File.join(File.dirname(__FILE__), 'fixtures', 'number_one_no_debug_no_compression.swx'))
9
+ end
10
+
11
+ it 'should assemble a swx file with debugging and without compression' do
12
+ BytecodeConverter.should_receive(:convert).with(1).once.and_return('0701000000')
13
+ SwxAssembler.write_swf(1, true, 0).should == File.read(File.join(File.dirname(__FILE__), 'fixtures', 'number_one_with_debug_no_compression.swx'))
14
+ end
15
+
16
+ it 'should assemble a swx file without debugging, without compression, and with an arbitrary "allow domain" url' do
17
+ BytecodeConverter.should_receive(:convert).with('file://Macintosh HD/Users/Jed/Development/Libraries/rSWX/testing/flash/data_testing.swf').once.and_return('0066696C653A2F2F4D6163696E746F73682048442F55736572732F4A65642F446576656C6F706D656E742F4C69627261726965732F725357582F74657374696E672F666C6173682F646174615F74657374696E672E73776600')
18
+ BytecodeConverter.should_receive(:convert).with(1).once.and_return('0701000000')
19
+ SwxAssembler.write_swf(1, false, 0, 'file:///Macintosh HD/Users/Jed/Development/Libraries/rSWX/testing/flash/data_testing.swf').should == File.read(File.join(File.dirname(__FILE__), 'fixtures', 'number_one_no_debug_no_compression_arbitrary_allow_domain.swx'))
20
+ end
21
+
22
+ it 'should assemble a swx file without debugging and with compression' do
23
+ BytecodeConverter.should_receive(:convert).with(1).once.and_return('0701000000')
24
+ SwxAssembler.write_swf(1, false, 4).should == File.read(File.join(File.dirname(__FILE__), 'fixtures', 'number_one_no_debug_compression_4.swx'))
25
+ end
26
+
27
+ it 'should assemble a swx file with debugging and with compression' do
28
+ BytecodeConverter.should_receive(:convert).with(1).once.and_return('0701000000')
29
+ SwxAssembler.write_swf(1, true, 4).should == File.read(File.join(File.dirname(__FILE__), 'fixtures', 'number_one_with_debug_compression_4.swx'))
30
+ end
31
+ end
32
+
33
+ describe 'SwxAssembler#allow_domain_bytecode' do
34
+ it 'should generate bytecode to allow an arbitrary url when a url is passed' do
35
+ SwxAssembler.allow_domain_bytecode('file://Macintosh HD/Users/Jed/Development/Libraries/rSWX/testing/flash/data_testing.swf').should == '9666000066696C653A2F2F4D6163696E746F73682048442F55736572732F4A65642F446576656C6F706D656E742F4C69627261726965732F725357582F74657374696E672F666C6173682F646174615F74657374696E672E7377660007010000000053797374656D001C960A00007365637572697479004E960D0000616C6C6F77446F6D61696E005217'
36
+ end
37
+
38
+ it 'should return bytecode to allow all domains if no url is passed' do
39
+ SwxAssembler.allow_domain_bytecode.should == '960900005F706172656E74001C960600005F75726C004E960D0007010000000053797374656D001C960A00007365637572697479004E960D0000616C6C6F77446F6D61696E005217'
40
+ end
41
+ end
42
+
43
+ require 'zlib'
44
+
45
+ describe 'SwxAssembler#compress_swx_file' do
46
+ it 'should remove the first eight bytes of the string before compressing' do
47
+ @swx_file = '123456789'
48
+ @swx_file.should_receive(:slice!).with(0...8).and_return('12345678')
49
+ SwxAssembler.compress_swx_file(@swx_file, 4)
50
+ end
51
+
52
+ it 'should compress the remainder of the string using Zlib' do
53
+ @swx_file = '123456789'
54
+ Zlib::Deflate.should_receive(:deflate).with(@swx_file[8..-1], 4).and_return('a compressed string')
55
+ SwxAssembler.compress_swx_file(@swx_file, 4)
56
+ end
57
+ end
58
+
59
+
60
+