cartilage 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.markdown +57 -0
- data/Rakefile +84 -0
- data/app/assets/images/cartilage/patterns/background.dark.png +0 -0
- data/app/assets/images/cartilage/patterns/background.dark.psd +0 -0
- data/app/assets/images/cartilage/patterns/background.light.png +0 -0
- data/app/assets/images/cartilage/patterns/background.light.psd +0 -0
- data/app/assets/images/cartilage/patterns/background.medium.png +0 -0
- data/app/assets/images/cartilage/patterns/background.medium.psd +0 -0
- data/app/assets/images/cartilage/patterns/background.png +0 -0
- data/app/assets/images/cartilage/patterns/background.psd +0 -0
- data/app/assets/javascripts/cartilage/application.js.coffee +45 -0
- data/app/assets/javascripts/cartilage/collections/segments.js.coffee +4 -0
- data/app/assets/javascripts/cartilage/core.js.coffee +8 -0
- data/app/assets/javascripts/cartilage/models/model.js.coffee +2 -0
- data/app/assets/javascripts/cartilage/models/segment.js.coffee +2 -0
- data/app/assets/javascripts/cartilage/views/bar_segment_view.js.coffee +58 -0
- data/app/assets/javascripts/cartilage/views/bar_view.js.coffee +85 -0
- data/app/assets/javascripts/cartilage/views/content_view.js.coffee +16 -0
- data/app/assets/javascripts/cartilage/views/image_view.js.coffee +76 -0
- data/app/assets/javascripts/cartilage/views/list_view.js.coffee +515 -0
- data/app/assets/javascripts/cartilage/views/list_view_item.js.coffee +85 -0
- data/app/assets/javascripts/cartilage/views/loading_indicator_view.js.coffee +147 -0
- data/app/assets/javascripts/cartilage/views/matrix_view.js.coffee +253 -0
- data/app/assets/javascripts/cartilage/views/matrix_view_item.js.coffee +5 -0
- data/app/assets/javascripts/cartilage/views/modal_view.js.coffee +26 -0
- data/app/assets/javascripts/cartilage/views/popover_view.js.coffee +212 -0
- data/app/assets/javascripts/cartilage/views/source_list_view.js.coffee +69 -0
- data/app/assets/javascripts/cartilage/views/source_list_view_item.js.coffee +5 -0
- data/app/assets/javascripts/cartilage/views/split_view.js.coffee +175 -0
- data/app/assets/javascripts/cartilage/views/usage_bar_view.js.coffee +5 -0
- data/app/assets/javascripts/cartilage/views/view.js.coffee +232 -0
- data/app/assets/javascripts/cartilage.js.coffee +18 -0
- data/app/assets/javascripts/extensions/console.js.coffee +9 -0
- data/app/assets/javascripts/extensions/constructor_name.js.coffee +10 -0
- data/app/assets/javascripts/extensions/properties.js.coffee +45 -0
- data/app/assets/javascripts/extensions/underscore.js.coffee +71 -0
- data/app/assets/stylesheets/cartilage/core.css.scss +432 -0
- data/app/assets/stylesheets/cartilage/mixins.css.scss +19 -0
- data/app/assets/stylesheets/cartilage/responsive.css.scss +192 -0
- data/app/assets/stylesheets/cartilage/variables.css.scss +113 -0
- data/app/assets/stylesheets/cartilage/views/list_view.css.scss +41 -0
- data/app/assets/stylesheets/cartilage/views/list_view_item.css.scss +47 -0
- data/app/assets/stylesheets/cartilage/views/loading_indicator_view.css.scss +50 -0
- data/app/assets/stylesheets/cartilage/views/matrix_view.css.scss +87 -0
- data/app/assets/stylesheets/cartilage/views/popover_view.css.scss +124 -0
- data/app/assets/stylesheets/cartilage/views/segmented_view.css.scss +98 -0
- data/app/assets/stylesheets/cartilage/views/source_list_view.css.scss +65 -0
- data/app/assets/stylesheets/cartilage/views/split_view.css.scss +80 -0
- data/app/assets/stylesheets/cartilage/views/usage_bar_view.css.scss +101 -0
- data/app/assets/stylesheets/cartilage/views/view.css.scss +13 -0
- data/app/assets/stylesheets/cartilage.css.scss +5 -0
- data/lib/cartilage/engine.rb +14 -0
- data/lib/cartilage/version.rb +3 -0
- data/lib/cartilage.rb +5 -0
- data/lib/tasks/cartilage_tasks.rake +4 -0
- data/test/cartilage_test.rb +7 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +9 -0
- data/test/dummy/app/assets/stylesheets/application.css +7 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config/application.rb +45 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +30 -0
- data/test/dummy/config/environments/production.rb +60 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +58 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/readme +6 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +26 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/framework/cartilage/application_test.js.coffee +14 -0
- data/test/framework/cartilage/views/bar_segment_view_test.js.coffee +5 -0
- data/test/framework/cartilage/views/bar_view_test.js.coffee +30 -0
- data/test/framework/cartilage/views/image_view_test.js.coffee +27 -0
- data/test/framework/cartilage/views/list_view_item_test.js.coffee +17 -0
- data/test/framework/cartilage/views/list_view_test.js.coffee +190 -0
- data/test/framework/cartilage/views/loading_indicator_view_test.js.coffee +5 -0
- data/test/framework/cartilage/views/matrix_view_item_test.js.coffee +5 -0
- data/test/framework/cartilage/views/matrix_view_test.js.coffee +5 -0
- data/test/framework/cartilage/views/popover_view_test.js.coffee +5 -0
- data/test/framework/cartilage/views/source_list_view_item_test.js.coffee +5 -0
- data/test/framework/cartilage/views/source_list_view_test.js.coffee +5 -0
- data/test/framework/cartilage/views/split_view_test.js.coffee +5 -0
- data/test/framework/cartilage/views/usage_bar_view_test.js.coffee +5 -0
- data/test/framework/cartilage/views/view_test.js.coffee +85 -0
- data/test/framework/extensions/properties_test.js.coffee +82 -0
- data/test/framework/extensions/underscore_test.js.coffee +73 -0
- data/test/framework/index.html +72 -0
- data/test/framework/vendor/backbone.js +1431 -0
- data/test/framework/vendor/coffee-script.js +8 -0
- data/test/framework/vendor/jquery.js +9440 -0
- data/test/framework/vendor/phantomjs-runner.js +196 -0
- data/test/framework/vendor/qunit.css +235 -0
- data/test/framework/vendor/qunit.js +1977 -0
- data/test/framework/vendor/run-qunit.js +81 -0
- data/test/framework/vendor/sinon-1.5.0.js +4142 -0
- data/test/framework/vendor/sinon-qunit-1.0.0.js +62 -0
- data/test/framework/vendor/underscore.js +1059 -0
- data/test/test_helper.rb +10 -0
- metadata +373 -0
@@ -0,0 +1,6 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
|
+
|
4
|
+
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
5
|
+
require File.expand_path('../../config/boot', __FILE__)
|
6
|
+
require 'rails/commands'
|
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
module "Cartilage.Application"
|
3
|
+
|
4
|
+
test "should initialize and launch application", ->
|
5
|
+
class TestApplication extends Cartilage.Application
|
6
|
+
initialize: ->
|
7
|
+
new Backbone.Router
|
8
|
+
routes:
|
9
|
+
"": "showMainView"
|
10
|
+
showMainView: ->
|
11
|
+
"mainView"
|
12
|
+
Backbone.history.start({ pushState: true })
|
13
|
+
TestApplication.launch()
|
14
|
+
ok not _.isNull(TestApplication.sharedInstance), "sharedInstance should not be null"
|
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
module "Cartilage.Views.BarView"
|
3
|
+
|
4
|
+
setup: ->
|
5
|
+
@testView = new Cartilage.Views.BarView
|
6
|
+
segments: new Cartilage.Collections.Segments([
|
7
|
+
new Cartilage.Models.Segment({ maximum: 20 }),
|
8
|
+
new Cartilage.Models.Segment({ maximum: 40 }),
|
9
|
+
new Cartilage.Models.Segment({ maximum: 60 }),
|
10
|
+
new Cartilage.Models.Segment({ maximum: 80 }),
|
11
|
+
new Cartilage.Models.Segment({ maximum: 100 })
|
12
|
+
])
|
13
|
+
value: 54
|
14
|
+
|
15
|
+
@testView.prepare()
|
16
|
+
|
17
|
+
test "should calculate correct widths", 5, ->
|
18
|
+
|
19
|
+
_.each(@testView.subviews, (subview) ->
|
20
|
+
# treat 0.19999999999999996 as 0.20
|
21
|
+
equal subview.width.toFixed(2), 0.20, "correct width"
|
22
|
+
)
|
23
|
+
|
24
|
+
test "should calculate correct fillWidths", 5, ->
|
25
|
+
|
26
|
+
equal @testView.subviews[0].fillWidth, 1, "correct fillWidth"
|
27
|
+
equal @testView.subviews[1].fillWidth, 1, "correct fillWidth"
|
28
|
+
equal @testView.subviews[2].fillWidth, 0.7,"correct fillWidth" # 70% (14/20)of 3rd segment
|
29
|
+
equal @testView.subviews[3].fillWidth, 0, "correct fillWidth"
|
30
|
+
equal @testView.subviews[4].fillWidth, 0, "correct fillWidth"
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module "Cartilage.Views.ImageView"
|
2
|
+
setup: ->
|
3
|
+
@imageView = new Cartilage.Views.ImageView
|
4
|
+
|
5
|
+
test "isLoaded property should be read-only", 1, ->
|
6
|
+
@imageView.isLoaded = true
|
7
|
+
ok @imageView.isLoaded == false, "isLoaded should be false"
|
8
|
+
|
9
|
+
test "isError property should be read-only", 1, ->
|
10
|
+
@imageView.isError = true
|
11
|
+
ok @imageView.isError == false, "isError should be false"
|
12
|
+
|
13
|
+
asyncTest "should fire load event upon successful load", 1, ->
|
14
|
+
@imageView.on "load", ->
|
15
|
+
ok true, 'load called'
|
16
|
+
start()
|
17
|
+
|
18
|
+
@imageView.imageAddress = "http://www.placehold.it/500x500"
|
19
|
+
$('#testElement').html @imageView.render().el
|
20
|
+
|
21
|
+
asyncTest "should fire error event upon unsuccessful load attempt", 1, ->
|
22
|
+
@imageView.on "error", ->
|
23
|
+
ok true, 'error called'
|
24
|
+
start()
|
25
|
+
|
26
|
+
@imageView.imageAddress = '404'
|
27
|
+
$('#testElement').html @imageView.render().el
|
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
module "Cartilage.Views.ListViewItem"
|
3
|
+
|
4
|
+
setup: ->
|
5
|
+
@testCollection = new Backbone.Collection([ {id: 1, name: "one"},
|
6
|
+
{id: 2, name: "two"},
|
7
|
+
{id: 3, name: "three"} ],
|
8
|
+
model: Backbone.Model)
|
9
|
+
|
10
|
+
@testListView = new Cartilage.Views.ListView
|
11
|
+
collection: @testCollection
|
12
|
+
allowsDragToReorder: yes
|
13
|
+
|
14
|
+
test "should contain data-model-id on list items", 3, ->
|
15
|
+
@testListView.prepare()
|
16
|
+
$('#testElement').html @testListView.render().el
|
17
|
+
_.each([1,2,3], (itemId) => ok $("*[data-model-id='" + itemId + "']").length > 0)
|
@@ -0,0 +1,190 @@
|
|
1
|
+
module "Cartilage.Views.BasicListView"
|
2
|
+
setup: ->
|
3
|
+
@testCollection = new Backbone.Collection([ {id: 1, name: "one"},
|
4
|
+
{id: 2, name: "two"},
|
5
|
+
{id: 3, name: "three"} ],
|
6
|
+
model: Backbone.Model)
|
7
|
+
|
8
|
+
@testListView = new Cartilage.Views.ListView
|
9
|
+
collection: @testCollection
|
10
|
+
|
11
|
+
test "should render collection correctly", 3, ->
|
12
|
+
@testListView.prepare()
|
13
|
+
$('#testElement').html @testListView.render().el
|
14
|
+
ok $('.list-view').length, "ListView container was created."
|
15
|
+
equal $('.list-view-items-container > li').length, 3, "testListView should have 3 items."
|
16
|
+
equal @testListView.selected.length, 0, "testListView should have 0 selected items."
|
17
|
+
|
18
|
+
test "should add an item to the list view", 3, ->
|
19
|
+
@testListView.prepare()
|
20
|
+
$('#testElement').html @testListView.render().el
|
21
|
+
ok $('.list-view').length, "ListView container was created."
|
22
|
+
equal $('.list-view-items-container > li').length, 3, "testListView should have 3 items."
|
23
|
+
@testCollection.add({id: 4, name: "four"})
|
24
|
+
equal $('.list-view-items-container > li').length, 4, "testListView should now have 4 items."
|
25
|
+
|
26
|
+
test "should remove an item from the list view", 3, ->
|
27
|
+
@testListView.prepare()
|
28
|
+
$('#testElement').html @testListView.render().el
|
29
|
+
ok $('.list-view').length, "ListView container was created."
|
30
|
+
equal $('.list-view-items-container > li').length, 3, "testListView should have 3 items."
|
31
|
+
@testCollection.remove(@testCollection.get(3))
|
32
|
+
equal $('.list-view-items-container > li').length, 2, "testListView should now have 2 items."
|
33
|
+
|
34
|
+
asyncTest "should trigger select event for single-select ListView", 1, ->
|
35
|
+
@testListView.prepare()
|
36
|
+
$('#testElement').html @testListView.render().el
|
37
|
+
|
38
|
+
@testListView.on "select", ->
|
39
|
+
ok true, "Select event should have been triggered."
|
40
|
+
start()
|
41
|
+
@testListView.selectFirst()
|
42
|
+
|
43
|
+
asyncTest "should trigger deselect event for single-select ListView", 1, ->
|
44
|
+
@testListView.prepare()
|
45
|
+
$('#testElement').html @testListView.render().el
|
46
|
+
|
47
|
+
@testListView.on "deselect", ->
|
48
|
+
ok true, "Deselect event should have been triggered."
|
49
|
+
start()
|
50
|
+
@testListView.selectFirst()
|
51
|
+
@testListView.deselect($('.list-view > ul.list-view-items-container > li').first())
|
52
|
+
|
53
|
+
module "Cartilage.Views.ListView.AllowsMultipleSelection"
|
54
|
+
setup: ->
|
55
|
+
@testListView = null
|
56
|
+
testCollection = new Backbone.Collection([ {id: 1, name: "one"},
|
57
|
+
{id: 2, name: "two"},
|
58
|
+
{id: 3, name: "three"} ],
|
59
|
+
model: Backbone.Model)
|
60
|
+
|
61
|
+
@testListView = new Cartilage.Views.ListView
|
62
|
+
collection: testCollection
|
63
|
+
allowsMultipleSelection: yes
|
64
|
+
|
65
|
+
asyncTest "should trigger add event on @selected collection for multi-select ListView", 2, ->
|
66
|
+
@testListView.prepare()
|
67
|
+
$('#testElement').html @testListView.render().el
|
68
|
+
|
69
|
+
@testListView.selected.on "add", ->
|
70
|
+
ok true, "add was called on multi-select"
|
71
|
+
start()
|
72
|
+
|
73
|
+
@testListView.selectFirst() #select($('.list-view > ul.list-view-items-container > li').first())
|
74
|
+
equal @testListView.selected.length, 1, "One element should have been selected"
|
75
|
+
|
76
|
+
asyncTest "should trigger remove event on @selected collection for multi-select ListView", 3, ->
|
77
|
+
@testListView.prepare()
|
78
|
+
$('#testElement').html @testListView.render().el
|
79
|
+
|
80
|
+
@testListView.selected.on "remove", ->
|
81
|
+
ok true, "remove was called on multi-select"
|
82
|
+
start()
|
83
|
+
|
84
|
+
@testListView.select($('.list-view > ul.list-view-items-container > li').first())
|
85
|
+
@testListView.selectAnother($('.list-view > ul.list-view-items-container > li').last())
|
86
|
+
equal @testListView.selected.length, 2, "Two elements should have been selected"
|
87
|
+
@testListView.deselect($('.list-view > ul.list-view-items-container > li').first())
|
88
|
+
equal @testListView.selected.length, 1, "Only one element should have been selected after deselect"
|
89
|
+
|
90
|
+
asyncTest "should trigger reset event on @selected collection for multi-select ListView", 3, ->
|
91
|
+
@testListView.prepare()
|
92
|
+
$('#testElement').html @testListView.render().el
|
93
|
+
|
94
|
+
@testListView.selected.on "reset", =>
|
95
|
+
ok true, "reset was called"
|
96
|
+
start()
|
97
|
+
|
98
|
+
@testListView.select($('.list-view > ul.list-view-items-container > li').first())
|
99
|
+
@testListView.selectAnother($('.list-view > ul.list-view-items-container > li').last())
|
100
|
+
equal @testListView.selected.length, 2, "Two elements should have been selected"
|
101
|
+
@testListView.clearSelection()
|
102
|
+
equal @testListView.selected.length, 0, "No elements should have been selected"
|
103
|
+
|
104
|
+
test "should keep selected items collection in the same order as collection passed to the view", 5, ->
|
105
|
+
@testListView.prepare()
|
106
|
+
$('#testElement').html @testListView.render().el
|
107
|
+
|
108
|
+
@testListView.select($('.list-view > ul.list-view-items-container > li').first())
|
109
|
+
@testListView.selectAnother($('.list-view > ul.list-view-items-container > li').last())
|
110
|
+
|
111
|
+
equal @testListView.collection.at(0), @testListView.selected.at(0)
|
112
|
+
equal @testListView.collection.at(2), @testListView.selected.at(1)
|
113
|
+
|
114
|
+
@testListView.selectAnother($('.list-view > ul.list-view-items-container > li')[1])
|
115
|
+
|
116
|
+
equal @testListView.collection.at(0), @testListView.selected.at(0)
|
117
|
+
equal @testListView.collection.at(1), @testListView.selected.at(1)
|
118
|
+
equal @testListView.collection.at(2), @testListView.selected.at(2)
|
119
|
+
|
120
|
+
module "Cartilage.Views.ListView.Ordered"
|
121
|
+
setup: ->
|
122
|
+
@testListView = null
|
123
|
+
@testCollection = new Backbone.Collection( [],
|
124
|
+
model: Backbone.Model,
|
125
|
+
comparator: (item) -> item.get("name")
|
126
|
+
)
|
127
|
+
@testListView = new Cartilage.Views.ListView
|
128
|
+
collection: @testCollection
|
129
|
+
ordered: yes
|
130
|
+
|
131
|
+
test "should render items inserted into the collection in the proper order on the screen", 9, ->
|
132
|
+
@testListView.prepare()
|
133
|
+
$('#testElement').html @testListView.render().el
|
134
|
+
equal $('#testElement li').length, 0, "No elements should have been rendered"
|
135
|
+
@testCollection.add({id: "charlie", name: "charlie"})
|
136
|
+
equal $('#testElement li').length, 1, "One element should have been rendered"
|
137
|
+
@testCollection.add({id: "alpha", name: "alpha"})
|
138
|
+
equal $('#testElement li').length, 2, "Two elements should have been rendered"
|
139
|
+
equal $('#testElement li').first().data('model'), @testCollection.get("alpha"), "alpha should have been rendered first"
|
140
|
+
equal $('#testElement li').last().data('model'), @testCollection.get("charlie"), "charlie should have been rendered last"
|
141
|
+
@testCollection.add({id: "bravo", name: "bravo"})
|
142
|
+
equal $('#testElement li').length, 3, "Three elements should have been rendered"
|
143
|
+
equal $('#testElement li').first().data('model'), @testCollection.get("alpha"), "alpha should have been rendered first"
|
144
|
+
equal $('#testElement li').eq(1).data('model'), @testCollection.get("bravo"), "bravo should have been rendered second"
|
145
|
+
equal $('#testElement li').last().data('model'), @testCollection.get("charlie"), "charlie should have been rendered last"
|
146
|
+
|
147
|
+
test "should render removed items back into the proper position", 4, ->
|
148
|
+
@testCollection.add([{id: "alpha", name: "alpha"}, {id: "bravo", name: "bravo"}, {id: "charlie", name: "charlie"}])
|
149
|
+
@testListView.prepare()
|
150
|
+
$('#testElement').html @testListView.render().el
|
151
|
+
equal $('#testElement li').length, 3, "Three elements should have been rendered"
|
152
|
+
@bravo = @testCollection.get("bravo")
|
153
|
+
@testCollection.remove(@bravo)
|
154
|
+
equal $('#testElement li').length, 2, "Two elements should have been rendered"
|
155
|
+
@testCollection.add(@bravo)
|
156
|
+
equal $('#testElement li').length, 3, "Three elements should have been rendered"
|
157
|
+
equal $('#testElement li').eq(1).data('model'), @testCollection.get("bravo"), "bravo should have been reinserted second"
|
158
|
+
|
159
|
+
|
160
|
+
# This is how I'd like to test to make sure clicks get passed through to links contained
|
161
|
+
# in the ListViewItem, but there's no way to simulate a click at coordinates in pure JS.
|
162
|
+
#
|
163
|
+
# module "Cartilage.Views.ListView.SelectionDisabled"
|
164
|
+
# setup: ->
|
165
|
+
# @testListView = null
|
166
|
+
|
167
|
+
# class window.TestModel extends Backbone.Model
|
168
|
+
# @testCollection = new Backbone.Collection([ {id: 1, name: "one"},
|
169
|
+
# {id: 2, name: "two"},
|
170
|
+
# {id: 3, name: "three"} ],
|
171
|
+
# model: TestModel)
|
172
|
+
|
173
|
+
# class window.TestListViewItem extends Cartilage.Views.ListViewItem
|
174
|
+
# window.JST = { "test_list_view_item": _.template('<a href="<%= testModel.get(\'name\') %>" id="link-<%= testModel.get(\'id\') %>">Link</a>')}
|
175
|
+
|
176
|
+
# @testListView = new Cartilage.Views.ListView
|
177
|
+
# collection: @testCollection
|
178
|
+
# allowsSelection: no
|
179
|
+
# allowsDeselction: no
|
180
|
+
# itemView: TestListViewItem
|
181
|
+
|
182
|
+
# asyncTest "should pass a click in the listview through to the underlying element", 1, ->
|
183
|
+
# @testListView.prepare()
|
184
|
+
# $('#testElement').html @testListView.render().el
|
185
|
+
# $('#testElement a#link-1').click (e) ->
|
186
|
+
# ok true, "Click was received"
|
187
|
+
# start()
|
188
|
+
# e.preventDefault();
|
189
|
+
# offset = $('#testElement a#link-1').offset();
|
190
|
+
# $("#testElement a#link-1").simulate("click", {screenX: offset.left + 5, screenY: offset.top + 5})
|
@@ -0,0 +1,85 @@
|
|
1
|
+
|
2
|
+
module "Cartilage.View"
|
3
|
+
|
4
|
+
setup: ->
|
5
|
+
window.TestView = null
|
6
|
+
|
7
|
+
test "superview property should be read-only", ->
|
8
|
+
testView = new Cartilage.View
|
9
|
+
testView.superview = "foobar"
|
10
|
+
ok _.isNull(testView.superview), "superview should be null"
|
11
|
+
|
12
|
+
test "subviews property should be read-only", ->
|
13
|
+
testView = new Cartilage.View
|
14
|
+
testView.subviews = "foobar"
|
15
|
+
deepEqual testView.subviews, [], "subviews should be an empty array"
|
16
|
+
|
17
|
+
test "observers property should be read-only", ->
|
18
|
+
testView = new Cartilage.View
|
19
|
+
testView.observers = "foobar"
|
20
|
+
deepEqual testView.observers, [], "observers should be an empty array"
|
21
|
+
|
22
|
+
test "addSubview method should add the view to subviews array", ->
|
23
|
+
class TestView extends Cartilage.View
|
24
|
+
class TestSubview extends Cartilage.View
|
25
|
+
testView = new TestView
|
26
|
+
testSubview = new TestSubview
|
27
|
+
testView.addSubview(testSubview)
|
28
|
+
deepEqual testView.subviews, [ testSubview ], "testSubview should be in the subviews array"
|
29
|
+
|
30
|
+
test "addSubview should add subview's element to its element", ->
|
31
|
+
class TestView extends Cartilage.View
|
32
|
+
class TestSubview extends Cartilage.View
|
33
|
+
testView = new TestView
|
34
|
+
testSubview = new TestSubview
|
35
|
+
testView.addSubview(testSubview)
|
36
|
+
equal testSubview.outerHTML, testView.innerHTML, "innerHTML of testView's element should match testSubview's outerHTML"
|
37
|
+
|
38
|
+
test "addSubview should set the superview of the added subview to itself", ->
|
39
|
+
class TestView extends Cartilage.View
|
40
|
+
class TestSubview extends Cartilage.View
|
41
|
+
testView = new TestView
|
42
|
+
testSubview = new TestSubview
|
43
|
+
testView.addSubview(testSubview)
|
44
|
+
equal testSubview.superview, testView, "testSubview's superview should be equal to testView"
|
45
|
+
|
46
|
+
test "removeFromSuperview method remove the view from its parent view's subviews array", ->
|
47
|
+
class TestView extends Cartilage.View
|
48
|
+
class TestSubview extends Cartilage.View
|
49
|
+
testView = new TestView
|
50
|
+
testSubview = new TestSubview
|
51
|
+
testView.addSubview(testSubview)
|
52
|
+
deepEqual testView.subviews, [ testSubview ], "testSubview should be in the subviews array"
|
53
|
+
testSubview.removeFromSuperview()
|
54
|
+
deepEqual testView.subviews, [], "testView.subviews should be an empty array"
|
55
|
+
|
56
|
+
test "removeFromSuperview should clear the superview property", ->
|
57
|
+
class TestView extends Cartilage.View
|
58
|
+
class TestSubview extends Cartilage.View
|
59
|
+
testView = new TestView
|
60
|
+
testSubview = new TestSubview
|
61
|
+
testView.addSubview(testSubview)
|
62
|
+
equal testSubview.superview, testView, "testSubview's superview should be equal to testView"
|
63
|
+
testSubview.removeFromSuperview()
|
64
|
+
equal testSubview.superview, null, "testSubview's superview should be null"
|
65
|
+
|
66
|
+
test "should determine template name automatically", ->
|
67
|
+
window.JST = { "test_view": -> "TestView Template" }
|
68
|
+
class TestView extends Cartilage.View
|
69
|
+
testView = new TestView
|
70
|
+
equal testView.template(), "TestView Template", "template() should return 'TestView Template'"
|
71
|
+
|
72
|
+
test "should determine CSS class names from the inheritance chain", ->
|
73
|
+
class TestViewOne extends Cartilage.View
|
74
|
+
class TestViewTwo extends TestViewOne
|
75
|
+
class TestViewThree extends TestViewTwo
|
76
|
+
testView = new TestViewThree
|
77
|
+
className = testView.determineClassName()
|
78
|
+
equal className, "view test-view-one test-view-two test-view-three", "Class names array should include names for each parent in the inheritance chain"
|
79
|
+
|
80
|
+
test "should append custom CSS class names to the view's class names", ->
|
81
|
+
class TestView extends Cartilage.View
|
82
|
+
className: "extra-class-one extra-class-two"
|
83
|
+
testView = new TestView
|
84
|
+
className = testView.determineClassName()
|
85
|
+
equal className, "view test-view extra-class-one extra-class-two", "Class names should include both automatically determined names and custom names"
|
@@ -0,0 +1,82 @@
|
|
1
|
+
|
2
|
+
module "Extensions.Properties"
|
3
|
+
|
4
|
+
setup: ->
|
5
|
+
|
6
|
+
test "should initialize property", ->
|
7
|
+
|
8
|
+
class TestView extends Cartilage.View
|
9
|
+
@property "testProperty"
|
10
|
+
testView = new TestView
|
11
|
+
|
12
|
+
ok not _.isUndefined(testView._testProperty), "_testProperty should not be undefined"
|
13
|
+
ok _.isNull(testView._testProperty), "_testProperty should be null"
|
14
|
+
|
15
|
+
test "should initialize property with default value", ->
|
16
|
+
|
17
|
+
class TestView extends Cartilage.View
|
18
|
+
@property "testProperty", default: "foo"
|
19
|
+
testView = new TestView
|
20
|
+
|
21
|
+
equal testView.testProperty, "foo", "testProperty should equal 'foo'"
|
22
|
+
|
23
|
+
test "should disallow changes to read-only properties", ->
|
24
|
+
|
25
|
+
class TestView extends Cartilage.View
|
26
|
+
@property "testProperty", access: READONLY
|
27
|
+
testView = new TestView
|
28
|
+
|
29
|
+
testView.testProperty = "foobar"
|
30
|
+
ok _.isNull(testView.testProperty), "testProperty should be null"
|
31
|
+
|
32
|
+
test "should initialize read-only property with default value", ->
|
33
|
+
|
34
|
+
class TestView extends Cartilage.View
|
35
|
+
@property "testProperty", access: READONLY, default: "foobar"
|
36
|
+
testView = new TestView
|
37
|
+
|
38
|
+
equal testView.testProperty, "foobar", "testProperty should equal 'foobar'"
|
39
|
+
|
40
|
+
test "should initialize property with custom getter", ->
|
41
|
+
|
42
|
+
class TestView extends Cartilage.View
|
43
|
+
@property "testProperty",
|
44
|
+
get: -> "customGetter"
|
45
|
+
testView = new TestView
|
46
|
+
|
47
|
+
equal testView.testProperty, "customGetter", "testProperty should equal 'customGetter'"
|
48
|
+
|
49
|
+
test "should initialize property with custom setter", ->
|
50
|
+
|
51
|
+
class TestView extends Cartilage.View
|
52
|
+
@property "testProperty",
|
53
|
+
set: (value) -> @__testProperty = "customSetter"
|
54
|
+
testView = new TestView
|
55
|
+
testView.testProperty = "foo"
|
56
|
+
|
57
|
+
equal testView.testProperty, "customSetter", "testProperty should equal 'customSetter'"
|
58
|
+
|
59
|
+
test "should initialize property via super()", ->
|
60
|
+
|
61
|
+
class TestView extends Cartilage.View
|
62
|
+
@property "testProperty"
|
63
|
+
|
64
|
+
initialize: (options = {}) ->
|
65
|
+
options.testProperty = "bar"
|
66
|
+
super(options)
|
67
|
+
|
68
|
+
testView = new TestView
|
69
|
+
equal testView.testProperty, "bar"
|
70
|
+
|
71
|
+
test "should clone default instead of returning directly when it is an object", ->
|
72
|
+
|
73
|
+
class TestView extends Cartilage.View
|
74
|
+
@property "testProperty", default: {foo: "bar"}
|
75
|
+
|
76
|
+
testView1 = new TestView
|
77
|
+
testView2 = new TestView
|
78
|
+
|
79
|
+
testView1.testProperty.foo = "baz"
|
80
|
+
|
81
|
+
equal testView1.testProperty.foo, "baz"
|
82
|
+
equal testView2.testProperty.foo, "bar"
|
@@ -0,0 +1,73 @@
|
|
1
|
+
|
2
|
+
module "Extensions.Underscore"
|
3
|
+
|
4
|
+
# _.sum ----------------------------------------------------------------------
|
5
|
+
|
6
|
+
test "_.sum should sum arrays of numbers", ->
|
7
|
+
testArray = [ 1, 2, 3 ]
|
8
|
+
equal _.sum(testArray), 6, "Value expected to be 6 (1 + 2 + 3)"
|
9
|
+
|
10
|
+
test "_.sum should return NaN for non-numeric array entries", ->
|
11
|
+
testArray = [ 1, 2, "Foo" ]
|
12
|
+
ok _.isNaN(_.sum(testArray)), "Value expected to be NaN"
|
13
|
+
|
14
|
+
# _.dasherize ----------------------------------------------------------------
|
15
|
+
|
16
|
+
test "_.dasherize should convert title-cased string to dasherized string", ->
|
17
|
+
testString = "FooBarView"
|
18
|
+
equal _.dasherize(testString), "foo-bar-view", "Value for '#{testString}' expected to be 'foo-bar-view'"
|
19
|
+
|
20
|
+
test "_.dasherize should convert camel-cased string to dasherized string", ->
|
21
|
+
testString = "fooBarView"
|
22
|
+
equal _.dasherize(testString), "foo-bar-view", "Value for '#{testString}' expected to be 'foo-bar-view'"
|
23
|
+
|
24
|
+
test "_.dasherize should convert underscored string to dasherized string", ->
|
25
|
+
testString = "foo_bar_view"
|
26
|
+
equal _.dasherize(testString), "foo-bar-view", "Value for '#{testString}' expected to be 'foo-bar-view'"
|
27
|
+
|
28
|
+
test "_.dasherize should leave dashed strings alone", ->
|
29
|
+
testString = "foo-bar-view"
|
30
|
+
equal _.dasherize(testString), "foo-bar-view", "Value for '#{testString}' expected to be 'foo-bar-view'"
|
31
|
+
|
32
|
+
# _.camelize -----------------------------------------------------------------
|
33
|
+
|
34
|
+
test "_.camelize should convert title-cased string to camel-cased string", ->
|
35
|
+
testString = "FooBarView"
|
36
|
+
equal _.camelize(testString), "fooBarView", "Value for '#{testString}' expected to be 'fooBarView'"
|
37
|
+
|
38
|
+
test "_.camelize should convert dashed string to camel-cased string", ->
|
39
|
+
testString = "foo-bar-view"
|
40
|
+
equal _.camelize(testString), "fooBarView", "Value for '#{testString}' expected to be 'fooBarView'"
|
41
|
+
|
42
|
+
test "_.camelize should convert underscored string to camel-cased string", ->
|
43
|
+
testString = "foo_bar_view"
|
44
|
+
equal _.camelize(testString), "fooBarView", "Value for '#{testString}' expected to be 'fooBarView'"
|
45
|
+
|
46
|
+
test "_.camelize should leave camel-cased strings alone", ->
|
47
|
+
testString = "fooBarView"
|
48
|
+
equal _.camelize(testString), "fooBarView", "Value for '#{testString}' expected to be 'fooBarView'"
|
49
|
+
|
50
|
+
# _.underscore ---------------------------------------------------------------
|
51
|
+
|
52
|
+
test "_.underscore should convert title-cased string to underscored string", ->
|
53
|
+
testString = "FooBarView"
|
54
|
+
equal _.underscore(testString), "foo_bar_view", "Value for '#{testString}' expected to be 'foo_bar_view'"
|
55
|
+
|
56
|
+
test "_.underscore should convert camel-cased string to underscored string", ->
|
57
|
+
testString = "fooBarView"
|
58
|
+
equal _.underscore(testString), "foo_bar_view", "Value for '#{testString}' expected to be 'foo_bar_view'"
|
59
|
+
|
60
|
+
test "_.underscore should convert dashed string to underscored string", ->
|
61
|
+
testString = "foo-bar-view"
|
62
|
+
equal _.underscore(testString), "foo_bar_view", "Value for '#{testString}' expected to be 'foo_bar_view'"
|
63
|
+
|
64
|
+
test "_.underscore should leave underscored strings alone", ->
|
65
|
+
testString = "foo_bar_view"
|
66
|
+
equal _.underscore(testString), "foo_bar_view", "Value for '#{testString}' expected to be 'foo_bar_view'"
|
67
|
+
|
68
|
+
# _.remove -------------------------------------------------------------------
|
69
|
+
|
70
|
+
test "_.remove should remove value from array", ->
|
71
|
+
testArray = [ "A", "B", "C" ]
|
72
|
+
_.remove(testArray, "B")
|
73
|
+
deepEqual testArray, [ "A", "C" ], "foo"
|