patch 0.4.13
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 +7 -0
- data/LICENSE +13 -0
- data/README.md +176 -0
- data/bin/patchrb +40 -0
- data/lib/patch/config.rb +124 -0
- data/lib/patch/em_patch.rb +47 -0
- data/lib/patch/hub.rb +68 -0
- data/lib/patch/io/midi/action.rb +42 -0
- data/lib/patch/io/midi/input.rb +110 -0
- data/lib/patch/io/midi/message.rb +112 -0
- data/lib/patch/io/midi/output.rb +58 -0
- data/lib/patch/io/midi.rb +45 -0
- data/lib/patch/io/module.rb +35 -0
- data/lib/patch/io/osc/action.rb +43 -0
- data/lib/patch/io/osc/client.rb +60 -0
- data/lib/patch/io/osc/message.rb +109 -0
- data/lib/patch/io/osc/server.rb +159 -0
- data/lib/patch/io/osc.rb +43 -0
- data/lib/patch/io/websocket/node.rb +103 -0
- data/lib/patch/io/websocket/socket.rb +103 -0
- data/lib/patch/io/websocket.rb +27 -0
- data/lib/patch/io.rb +15 -0
- data/lib/patch/log.rb +97 -0
- data/lib/patch/message.rb +67 -0
- data/lib/patch/node/container.rb +69 -0
- data/lib/patch/node/map.rb +71 -0
- data/lib/patch/node.rb +10 -0
- data/lib/patch/patch.rb +59 -0
- data/lib/patch/report.rb +132 -0
- data/lib/patch/thread.rb +19 -0
- data/lib/patch.rb +42 -0
- data/test/config/nodes.yml +16 -0
- data/test/config/patches.yml +41 -0
- data/test/config_test.rb +216 -0
- data/test/helper.rb +20 -0
- data/test/hub_test.rb +49 -0
- data/test/io/midi/action_test.rb +82 -0
- data/test/io/midi/input_test.rb +130 -0
- data/test/io/midi/message_test.rb +54 -0
- data/test/io/midi/output_test.rb +44 -0
- data/test/io/midi_test.rb +94 -0
- data/test/io/module_test.rb +21 -0
- data/test/io/osc/action_test.rb +76 -0
- data/test/io/osc/client_test.rb +49 -0
- data/test/io/osc/message_test.rb +53 -0
- data/test/io/osc/server_test.rb +116 -0
- data/test/io/osc_test.rb +111 -0
- data/test/io/websocket/node_test.rb +96 -0
- data/test/io/websocket_test.rb +37 -0
- data/test/js/logger.js +67 -0
- data/test/js/message.js +62 -0
- data/test/js/qunit-1.18.0.js +3828 -0
- data/test/js/qunit.css +291 -0
- data/test/js/test.html +15 -0
- data/test/js/websocket.js +12 -0
- data/test/log_test.rb +96 -0
- data/test/message_test.rb +109 -0
- data/test/node/container_test.rb +104 -0
- data/test/node/map_test.rb +50 -0
- data/test/node_test.rb +14 -0
- data/test/patch_test.rb +57 -0
- data/test/report_test.rb +37 -0
- metadata +320 -0
data/test/io/osc_test.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class Patch::IO::OSCTest < Minitest::Test
|
4
|
+
|
5
|
+
context "OSC" do
|
6
|
+
|
7
|
+
context "#new_from_config" do
|
8
|
+
|
9
|
+
context "server" do
|
10
|
+
|
11
|
+
setup do
|
12
|
+
@config = {
|
13
|
+
:id => 3,
|
14
|
+
:type => "osc",
|
15
|
+
:server => {
|
16
|
+
:port => 8000
|
17
|
+
}
|
18
|
+
}
|
19
|
+
@server = Patch::IO::OSC.new_from_config(@config)
|
20
|
+
end
|
21
|
+
|
22
|
+
should "be server" do
|
23
|
+
refute_nil @server
|
24
|
+
assert Patch::IO::OSC::Server, @server.class
|
25
|
+
end
|
26
|
+
|
27
|
+
should "have id" do
|
28
|
+
refute_nil @server.id
|
29
|
+
assert_equal 3, @server.id
|
30
|
+
end
|
31
|
+
|
32
|
+
should "not initialize client" do
|
33
|
+
assert_nil @server.instance_variable_get("@client")
|
34
|
+
end
|
35
|
+
|
36
|
+
should "initialize server" do
|
37
|
+
refute_nil @server.instance_variable_get("@server")
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
context "server with echo" do
|
43
|
+
|
44
|
+
setup do
|
45
|
+
@config = {
|
46
|
+
:id => 4,
|
47
|
+
:type => "osc",
|
48
|
+
:client => {
|
49
|
+
:host => "192.168.1.118",
|
50
|
+
:port => 9000
|
51
|
+
},
|
52
|
+
:server => {
|
53
|
+
:port => 8000
|
54
|
+
}
|
55
|
+
}
|
56
|
+
@server = Patch::IO::OSC.new_from_config(@config)
|
57
|
+
end
|
58
|
+
|
59
|
+
should "be server" do
|
60
|
+
refute_nil @server
|
61
|
+
assert Patch::IO::OSC::Server, @server.class
|
62
|
+
end
|
63
|
+
|
64
|
+
should "have id" do
|
65
|
+
refute_nil @server.id
|
66
|
+
assert_equal 4, @server.id
|
67
|
+
end
|
68
|
+
|
69
|
+
should "initialize echo client" do
|
70
|
+
refute_nil @server.instance_variable_get("@client")
|
71
|
+
end
|
72
|
+
|
73
|
+
should "initialize server" do
|
74
|
+
refute_nil @server.instance_variable_get("@server")
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
context "client" do
|
80
|
+
|
81
|
+
setup do
|
82
|
+
@config = {
|
83
|
+
:id => 5,
|
84
|
+
:type => "osc",
|
85
|
+
:client => {
|
86
|
+
:host => "192.168.1.118",
|
87
|
+
:port => 9000
|
88
|
+
}
|
89
|
+
}
|
90
|
+
@client = ::Patch::IO::OSC.new_from_config(@config)
|
91
|
+
end
|
92
|
+
|
93
|
+
should "be client" do
|
94
|
+
refute_nil @client
|
95
|
+
assert Patch::IO::OSC::Client, @client.class
|
96
|
+
end
|
97
|
+
|
98
|
+
should "have id" do
|
99
|
+
refute_nil @client.id
|
100
|
+
assert_equal 5, @client.id
|
101
|
+
end
|
102
|
+
|
103
|
+
should "initialize underlying client" do
|
104
|
+
refute_nil @client.instance_variable_get("@client")
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class Patch::IO::Websocket::NodeTest < Minitest::Test
|
4
|
+
|
5
|
+
context "Node" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
load_test_data
|
9
|
+
@nodes = Patch::Config.to_nodes(@nodes_path)
|
10
|
+
@patches = Patch::Config.to_patches(@nodes, @patches_path)
|
11
|
+
@server = @nodes.find_all_by_type(:websocket).first
|
12
|
+
end
|
13
|
+
|
14
|
+
context "#listen" do
|
15
|
+
|
16
|
+
setup do
|
17
|
+
EM::WebSocket.expects(:run).once
|
18
|
+
end
|
19
|
+
|
20
|
+
teardown do
|
21
|
+
EM::WebSocket.unstub(:run)
|
22
|
+
#Patch::IO::Websocket.any_instance.unstub(:start)
|
23
|
+
end
|
24
|
+
|
25
|
+
should "start server" do
|
26
|
+
assert @server.listen(@patches.first) do
|
27
|
+
@val = "something"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
context "#start" do
|
34
|
+
|
35
|
+
setup do
|
36
|
+
EM::WebSocket.expects(:run).once
|
37
|
+
end
|
38
|
+
|
39
|
+
teardown do
|
40
|
+
EM::WebSocket.unstub(:run)
|
41
|
+
#Patch::IO::Websocket.any_instance.unstub(:start)
|
42
|
+
end
|
43
|
+
|
44
|
+
should "start server" do
|
45
|
+
assert @server.start
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
context "#puts" do
|
51
|
+
|
52
|
+
setup do
|
53
|
+
@message = Patch::Message.new
|
54
|
+
@message.index = 1
|
55
|
+
@message.value = 100
|
56
|
+
@message.patch_name = :test
|
57
|
+
end
|
58
|
+
|
59
|
+
should "convert message to json" do
|
60
|
+
@server.stubs(:running?).returns(true)
|
61
|
+
@server.instance_variable_set("@socket", Object.new)
|
62
|
+
@server.instance_variable_get("@socket").expects(:puts).once
|
63
|
+
assert @server.puts(@patches.first, @message)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
context "#handle_input" do
|
69
|
+
|
70
|
+
setup do
|
71
|
+
@timestamp = 1396406728702
|
72
|
+
hash = {
|
73
|
+
:value => "blah",
|
74
|
+
:timestamp => @timestamp
|
75
|
+
}
|
76
|
+
@message = hash.to_json
|
77
|
+
@result = @server.send(:handle_input, nil, @message)
|
78
|
+
end
|
79
|
+
|
80
|
+
should "convert from String to Message" do
|
81
|
+
refute_nil @result
|
82
|
+
assert_equal ::Patch::Message, @result.class
|
83
|
+
assert_equal "blah", @result.value
|
84
|
+
end
|
85
|
+
|
86
|
+
should "convert timestamp from js time to ruby" do
|
87
|
+
time = @result.time
|
88
|
+
refute_nil time
|
89
|
+
assert_equal Time.at(@timestamp / 1000), time
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class Patch::IO::WebsocketTest < Minitest::Test
|
4
|
+
|
5
|
+
context "Websocket" do
|
6
|
+
|
7
|
+
context "#new_from_config" do
|
8
|
+
|
9
|
+
setup do
|
10
|
+
@config = {
|
11
|
+
:id => 6,
|
12
|
+
:type => "websocket",
|
13
|
+
:host => "localhost",
|
14
|
+
:port => 9006
|
15
|
+
}
|
16
|
+
@websocket = Patch::IO::Websocket.new_from_config(@config)
|
17
|
+
end
|
18
|
+
|
19
|
+
should "be node" do
|
20
|
+
refute_nil @websocket
|
21
|
+
assert Patch::IO::Websocket::Node, @websocket.class
|
22
|
+
end
|
23
|
+
|
24
|
+
should "have id" do
|
25
|
+
refute_nil @websocket.id
|
26
|
+
assert_equal 6, @websocket.id
|
27
|
+
end
|
28
|
+
|
29
|
+
should "not initialize underlying socket yet" do
|
30
|
+
assert_nil @websocket.instance_variable_get("@socket")
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/test/js/logger.js
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
MockConsole = function() {
|
2
|
+
this._last;
|
3
|
+
}
|
4
|
+
MockConsole.prototype.log = function(something) {
|
5
|
+
this._last = something;
|
6
|
+
return true;
|
7
|
+
}
|
8
|
+
MockConsole.prototype.error = MockConsole.prototype.log;
|
9
|
+
MockConsole.prototype.last = function() {
|
10
|
+
var last = this._last;
|
11
|
+
delete this._last;
|
12
|
+
return last;
|
13
|
+
}
|
14
|
+
|
15
|
+
LOGMESSAGE = {
|
16
|
+
closed: "Closed",
|
17
|
+
prefix: "Test: ",
|
18
|
+
open: "Open"
|
19
|
+
}
|
20
|
+
|
21
|
+
var logger;
|
22
|
+
var fakeConsole = new MockConsole();
|
23
|
+
|
24
|
+
module("Patch.Logger", {
|
25
|
+
setup: function() {
|
26
|
+
logger = new Patch.Logger(LOGMESSAGE, fakeConsole);
|
27
|
+
}, teardown: function() {
|
28
|
+
delete logger;
|
29
|
+
}
|
30
|
+
});
|
31
|
+
test( "new", function(assert) {
|
32
|
+
assert.ok( (logger !== undefined && logger !== null), "logger is initialized" );
|
33
|
+
});
|
34
|
+
test( "info", function(assert) {
|
35
|
+
assert.ok(logger.info("hello"), "info method is called" );
|
36
|
+
assert.equal(fakeConsole.last(), "Test: hello", "message is sent to underlying logger" );
|
37
|
+
});
|
38
|
+
test( "object", function(assert) {
|
39
|
+
var obj = {something:"hello"};
|
40
|
+
assert.ok(logger.object(obj), "object method is called" );
|
41
|
+
assert.equal(fakeConsole.last(), obj, "object is sent to underlying logger" );
|
42
|
+
});
|
43
|
+
test( "debug", function(assert) {
|
44
|
+
// not enabled
|
45
|
+
logger.shouldDebug = false;
|
46
|
+
assert.notOk(logger.debug("hello"), "debug method is called" );
|
47
|
+
assert.equal(fakeConsole.last(), undefined, "message is not sent to underlying logger" );
|
48
|
+
// enabled
|
49
|
+
logger.shouldDebug = true;
|
50
|
+
assert.ok(logger.debug("hello"), "debug method is called" );
|
51
|
+
assert.equal(fakeConsole.last(), "Test: hello", "message is sent to underlying logger" );
|
52
|
+
});
|
53
|
+
test( "debugObject", function(assert) {
|
54
|
+
// not enabled
|
55
|
+
logger.shouldDebug = false;
|
56
|
+
var obj = {something:"hello"};
|
57
|
+
assert.notOk(logger.debugObject(obj), "debugObject method is called" );
|
58
|
+
assert.equal(fakeConsole.last(), undefined, "object is not sent to underlying logger" );
|
59
|
+
// enabled
|
60
|
+
logger.shouldDebug = true;
|
61
|
+
assert.ok(logger.debugObject(obj), "debugObject method is called" );
|
62
|
+
assert.equal(fakeConsole.last(), obj, "object is sent to underlying logger" );
|
63
|
+
});
|
64
|
+
test( "error", function(assert) {
|
65
|
+
assert.ok(logger.error("hello"), "error method is called" );
|
66
|
+
assert.equal(fakeConsole.last(), "hello", "error is sent to underlying logger" );
|
67
|
+
});
|
data/test/js/message.js
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
var camera;
|
2
|
+
var number;
|
3
|
+
|
4
|
+
module("VZ.Camera", {
|
5
|
+
setup: function() {
|
6
|
+
camera = new VZ.Camera();
|
7
|
+
number = Math.floor((Math.random() * 100) + 1);
|
8
|
+
}, teardown: function() {
|
9
|
+
delete camera;
|
10
|
+
delete number;
|
11
|
+
}
|
12
|
+
});
|
13
|
+
test( "new", function() {
|
14
|
+
ok( (camera !== undefined && camera !== null), "camera is initialized" );
|
15
|
+
});
|
16
|
+
test( "position.set", function() {
|
17
|
+
camera.position.set(1,2,3);
|
18
|
+
equal(camera.position.x, 1);
|
19
|
+
equal(camera.position.y, 2);
|
20
|
+
equal(camera.position.z, 3);
|
21
|
+
});
|
22
|
+
test( "position=", function() {
|
23
|
+
camera.position.x = 10;
|
24
|
+
camera.position.y = 20;
|
25
|
+
camera.position.z = 30;
|
26
|
+
equal(camera.position.x, 10);
|
27
|
+
equal(camera.position.y, 20);
|
28
|
+
equal(camera.position.z, 30);
|
29
|
+
});
|
30
|
+
test( "saveState", function() {
|
31
|
+
camera.position.set(1,2,3);
|
32
|
+
camera.aspect = 30;
|
33
|
+
camera.fov = 40;
|
34
|
+
camera.near = 50;
|
35
|
+
camera.far = 60;
|
36
|
+
camera.saveState(number);
|
37
|
+
equal(camera.state[number].aspect, 30, "aspect");
|
38
|
+
equal(camera.state[number].fov, 40, "fov");
|
39
|
+
equal(camera.state[number].near, 50, "near");
|
40
|
+
equal(camera.state[number].far, 60, "far");
|
41
|
+
equal(camera.state[number].position.x, 1, "x");
|
42
|
+
equal(camera.state[number].position.y, 2, "y");
|
43
|
+
equal(camera.state[number].position.z, 3, "z");
|
44
|
+
});
|
45
|
+
test( "restoreState", function() {
|
46
|
+
camera.state[number] = {
|
47
|
+
aspect: 123,
|
48
|
+
fov: 234,
|
49
|
+
near: 345,
|
50
|
+
far: 456,
|
51
|
+
position: new THREE.Vector3(9, 10, 11),
|
52
|
+
target: new THREE.Vector3(13, 14, 15)
|
53
|
+
}
|
54
|
+
camera.restoreState(number);
|
55
|
+
equal(camera.aspect, 123, "aspect");
|
56
|
+
equal(camera.fov, 234, "fov");
|
57
|
+
equal(camera.near, 345, "near");
|
58
|
+
equal(camera.far, 456, "far");
|
59
|
+
equal(camera.position.x, 9, "x");
|
60
|
+
equal(camera.position.y, 10, "y");
|
61
|
+
equal(camera.position.z, 11, "z");
|
62
|
+
});
|