sassc 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +9 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +24 -0
  8. data/Rakefile +21 -0
  9. data/ext/libsass/.editorconfig +15 -0
  10. data/ext/libsass/.gitattributes +2 -0
  11. data/ext/libsass/.gitignore +61 -0
  12. data/ext/libsass/.travis.yml +38 -0
  13. data/ext/libsass/COPYING +25 -0
  14. data/ext/libsass/INSTALL +1 -0
  15. data/ext/libsass/LICENSE +25 -0
  16. data/ext/libsass/Makefile +223 -0
  17. data/ext/libsass/Makefile.am +145 -0
  18. data/ext/libsass/Readme.md +93 -0
  19. data/ext/libsass/appveyor.yml +76 -0
  20. data/ext/libsass/ast.cpp +581 -0
  21. data/ext/libsass/ast.hpp +1949 -0
  22. data/ext/libsass/ast_def_macros.hpp +16 -0
  23. data/ext/libsass/ast_factory.hpp +87 -0
  24. data/ext/libsass/ast_fwd_decl.hpp +72 -0
  25. data/ext/libsass/b64/cencode.h +32 -0
  26. data/ext/libsass/b64/encode.h +77 -0
  27. data/ext/libsass/backtrace.hpp +81 -0
  28. data/ext/libsass/base64vlq.cpp +43 -0
  29. data/ext/libsass/base64vlq.hpp +28 -0
  30. data/ext/libsass/bind.cpp +187 -0
  31. data/ext/libsass/bind.hpp +18 -0
  32. data/ext/libsass/cencode.c +102 -0
  33. data/ext/libsass/color_names.hpp +324 -0
  34. data/ext/libsass/configure.ac +130 -0
  35. data/ext/libsass/constants.cpp +144 -0
  36. data/ext/libsass/constants.hpp +145 -0
  37. data/ext/libsass/context.cpp +507 -0
  38. data/ext/libsass/context.hpp +150 -0
  39. data/ext/libsass/contextualize.cpp +157 -0
  40. data/ext/libsass/contextualize.hpp +65 -0
  41. data/ext/libsass/copy_c_str.cpp +13 -0
  42. data/ext/libsass/copy_c_str.hpp +5 -0
  43. data/ext/libsass/debug.hpp +39 -0
  44. data/ext/libsass/environment.hpp +75 -0
  45. data/ext/libsass/error_handling.cpp +28 -0
  46. data/ext/libsass/error_handling.hpp +28 -0
  47. data/ext/libsass/eval.cpp +1149 -0
  48. data/ext/libsass/eval.hpp +80 -0
  49. data/ext/libsass/expand.cpp +430 -0
  50. data/ext/libsass/expand.hpp +77 -0
  51. data/ext/libsass/extconf.rb +6 -0
  52. data/ext/libsass/extend.cpp +1962 -0
  53. data/ext/libsass/extend.hpp +50 -0
  54. data/ext/libsass/file.cpp +291 -0
  55. data/ext/libsass/file.hpp +18 -0
  56. data/ext/libsass/functions.cpp +1565 -0
  57. data/ext/libsass/functions.hpp +187 -0
  58. data/ext/libsass/inspect.cpp +727 -0
  59. data/ext/libsass/inspect.hpp +108 -0
  60. data/ext/libsass/json.cpp +1411 -0
  61. data/ext/libsass/json.hpp +117 -0
  62. data/ext/libsass/kwd_arg_macros.hpp +23 -0
  63. data/ext/libsass/m4/.gitkeep +0 -0
  64. data/ext/libsass/mapping.hpp +17 -0
  65. data/ext/libsass/memory_manager.hpp +54 -0
  66. data/ext/libsass/node.cpp +251 -0
  67. data/ext/libsass/node.hpp +122 -0
  68. data/ext/libsass/operation.hpp +153 -0
  69. data/ext/libsass/output_compressed.cpp +401 -0
  70. data/ext/libsass/output_compressed.hpp +95 -0
  71. data/ext/libsass/output_nested.cpp +364 -0
  72. data/ext/libsass/output_nested.hpp +108 -0
  73. data/ext/libsass/parser.cpp +2016 -0
  74. data/ext/libsass/parser.hpp +264 -0
  75. data/ext/libsass/paths.hpp +69 -0
  76. data/ext/libsass/position.hpp +22 -0
  77. data/ext/libsass/posix/getopt.c +562 -0
  78. data/ext/libsass/posix/getopt.h +95 -0
  79. data/ext/libsass/prelexer.cpp +688 -0
  80. data/ext/libsass/prelexer.hpp +513 -0
  81. data/ext/libsass/remove_placeholders.cpp +59 -0
  82. data/ext/libsass/remove_placeholders.hpp +43 -0
  83. data/ext/libsass/res/resource.rc +35 -0
  84. data/ext/libsass/sass.cpp +33 -0
  85. data/ext/libsass/sass.h +60 -0
  86. data/ext/libsass/sass2scss.cpp +834 -0
  87. data/ext/libsass/sass2scss.h +110 -0
  88. data/ext/libsass/sass_context.cpp +709 -0
  89. data/ext/libsass/sass_context.h +120 -0
  90. data/ext/libsass/sass_functions.cpp +137 -0
  91. data/ext/libsass/sass_functions.h +90 -0
  92. data/ext/libsass/sass_interface.cpp +277 -0
  93. data/ext/libsass/sass_interface.h +97 -0
  94. data/ext/libsass/sass_util.cpp +136 -0
  95. data/ext/libsass/sass_util.hpp +259 -0
  96. data/ext/libsass/sass_values.cpp +337 -0
  97. data/ext/libsass/sass_values.h +124 -0
  98. data/ext/libsass/script/bootstrap +10 -0
  99. data/ext/libsass/script/branding +10 -0
  100. data/ext/libsass/script/ci-build-libsass +72 -0
  101. data/ext/libsass/script/ci-install-compiler +4 -0
  102. data/ext/libsass/script/ci-install-deps +19 -0
  103. data/ext/libsass/script/ci-report-coverage +25 -0
  104. data/ext/libsass/script/coveralls-debug +32 -0
  105. data/ext/libsass/script/spec +5 -0
  106. data/ext/libsass/script/tap-driver +652 -0
  107. data/ext/libsass/script/tap-runner +1 -0
  108. data/ext/libsass/source_map.cpp +133 -0
  109. data/ext/libsass/source_map.hpp +46 -0
  110. data/ext/libsass/subset_map.hpp +145 -0
  111. data/ext/libsass/support/libsass.pc.in +11 -0
  112. data/ext/libsass/test-driver +127 -0
  113. data/ext/libsass/test/test_node.cpp +98 -0
  114. data/ext/libsass/test/test_paths.cpp +29 -0
  115. data/ext/libsass/test/test_selector_difference.cpp +28 -0
  116. data/ext/libsass/test/test_specificity.cpp +28 -0
  117. data/ext/libsass/test/test_subset_map.cpp +472 -0
  118. data/ext/libsass/test/test_superselector.cpp +71 -0
  119. data/ext/libsass/test/test_unification.cpp +33 -0
  120. data/ext/libsass/to_c.cpp +61 -0
  121. data/ext/libsass/to_c.hpp +44 -0
  122. data/ext/libsass/to_string.cpp +29 -0
  123. data/ext/libsass/to_string.hpp +32 -0
  124. data/ext/libsass/token.hpp +32 -0
  125. data/ext/libsass/units.cpp +54 -0
  126. data/ext/libsass/units.hpp +10 -0
  127. data/ext/libsass/utf8.h +34 -0
  128. data/ext/libsass/utf8/checked.h +327 -0
  129. data/ext/libsass/utf8/core.h +329 -0
  130. data/ext/libsass/utf8/unchecked.h +228 -0
  131. data/ext/libsass/utf8_string.cpp +102 -0
  132. data/ext/libsass/utf8_string.hpp +36 -0
  133. data/ext/libsass/util.cpp +189 -0
  134. data/ext/libsass/util.hpp +26 -0
  135. data/ext/libsass/win/libsass.filters +291 -0
  136. data/ext/libsass/win/libsass.sln +28 -0
  137. data/ext/libsass/win/libsass.vcxproj +255 -0
  138. data/lib/sassc.rb +6 -0
  139. data/lib/sassc/engine.rb +13 -0
  140. data/lib/sassc/native.rb +44 -0
  141. data/lib/sassc/native/native_context_api.rb +140 -0
  142. data/lib/sassc/native/native_functions_api.rb +41 -0
  143. data/lib/sassc/native/sass_input_style.rb +11 -0
  144. data/lib/sassc/native/sass_output_style.rb +10 -0
  145. data/lib/sassc/native/sass_value.rb +95 -0
  146. data/lib/sassc/native/string_list.rb +8 -0
  147. data/lib/sassc/version.rb +3 -0
  148. data/sassc.gemspec +43 -0
  149. data/test/smoke_test.rb +171 -0
  150. data/test/test_helper.rb +4 -0
  151. metadata +281 -0
@@ -0,0 +1,98 @@
1
+ #include <assert.h>
2
+ #include <sstream>
3
+
4
+ #include "node.hpp"
5
+ #include "to_string.hpp"
6
+ #include "parser.hpp"
7
+
8
+
9
+ #define STATIC_ARRAY_SIZE(array) (sizeof((array))/sizeof((array[0])))
10
+
11
+
12
+ namespace Sass {
13
+
14
+ Context ctx = Context::Data();
15
+
16
+ To_String to_string;
17
+
18
+
19
+ const char* const ROUNDTRIP_TESTS[] = {
20
+ NULL,
21
+ "~",
22
+ "CMPD",
23
+ "~ CMPD",
24
+ "CMPD >",
25
+ "> > CMPD",
26
+ "CMPD ~ ~",
27
+ "> + CMPD1.CMPD2 > ~",
28
+ "> + CMPD1.CMPD2 CMPD3.CMPD4 > ~",
29
+ "+ CMPD1 CMPD2 ~ CMPD3 + CMPD4 > CMPD5 > ~"
30
+ };
31
+
32
+
33
+
34
+ static Complex_Selector* createComplexSelector(string src) {
35
+ string temp(src);
36
+ temp += ";";
37
+ return (*Parser::from_c_str(temp.c_str(), ctx, "", Position()).parse_selector_group())[0];
38
+ }
39
+
40
+
41
+ void roundtripTest(const char* toTest) {
42
+
43
+ // Create the initial selector
44
+
45
+ Complex_Selector* pOrigSelector = NULL;
46
+ if (toTest) {
47
+ pOrigSelector = createComplexSelector(toTest);
48
+ }
49
+
50
+ string expected(pOrigSelector ? pOrigSelector->perform(&to_string) : "NULL");
51
+
52
+
53
+ // Roundtrip the selector into a node and back
54
+
55
+ Node node = complexSelectorToNode(pOrigSelector, ctx);
56
+
57
+ stringstream nodeStringStream;
58
+ nodeStringStream << node;
59
+ string nodeString = nodeStringStream.str();
60
+ cout << "ASNODE: " << node << endl;
61
+
62
+ Complex_Selector* pNewSelector = nodeToComplexSelector(node, ctx);
63
+
64
+ // Show the result
65
+
66
+ string result(pNewSelector ? pNewSelector->perform(&to_string) : "NULL");
67
+
68
+ cout << "SELECTOR: " << expected << endl;
69
+ cout << "NEW SELECTOR: " << result << endl;
70
+
71
+
72
+ // Test that they are equal using the equality operator
73
+
74
+ assert( (!pOrigSelector && !pNewSelector ) || (pOrigSelector && pNewSelector) );
75
+ if (pOrigSelector) {
76
+ assert( *pOrigSelector == *pNewSelector );
77
+ }
78
+
79
+
80
+ // Test that they are equal by comparing the string versions of the selectors
81
+
82
+ assert(expected == result);
83
+
84
+ }
85
+
86
+
87
+ int main() {
88
+ for (int index = 0; index < STATIC_ARRAY_SIZE(ROUNDTRIP_TESTS); index++) {
89
+ const char* const toTest = ROUNDTRIP_TESTS[index];
90
+ cout << "\nINPUT STRING: " << (toTest ? toTest : "NULL") << endl;
91
+ roundtripTest(toTest);
92
+ }
93
+
94
+ cout << "\nTesting Done.\n";
95
+ }
96
+
97
+
98
+ }
@@ -0,0 +1,29 @@
1
+ #include <iostream>
2
+ #include "../paths.hpp"
3
+
4
+ using namespace std;
5
+ using namespace Sass;
6
+
7
+ template<typename T>
8
+ vector<T>& operator<<(vector<T>& v, const T& e)
9
+ {
10
+ v.push_back(e);
11
+ return v;
12
+ }
13
+
14
+ int main()
15
+ {
16
+ vector<int> v1, v2, v3;
17
+ v1 << 1 << 2;
18
+ v2 << 3;
19
+ v3 << 4 << 5 << 6;
20
+
21
+ vector<vector<int> > ss;
22
+ ss << v1 << v2 << v3;
23
+
24
+ vector<vector<int> > ps = paths(ss);
25
+ for (size_t i = 0, S = ps.size(); i < S; ++i) {
26
+ cout << vector_to_string(ps[i]) << endl;
27
+ }
28
+ return 0;
29
+ }
@@ -0,0 +1,28 @@
1
+ #include "../ast.hpp"
2
+ #include "../context.hpp"
3
+ #include "../parser.hpp"
4
+ #include "../to_string.hpp"
5
+ #include <string>
6
+ #include <iostream>
7
+
8
+ using namespace std;
9
+ using namespace Sass;
10
+
11
+ Context ctx = Context::Data();
12
+ To_String to_string;
13
+
14
+ Compound_Selector* selector(string src)
15
+ { return Parser::from_c_str(src.c_str(), ctx, "", Position()).parse_simple_selector_sequence(); }
16
+
17
+ void diff(string s, string t)
18
+ {
19
+ cout << s << " - " << t << " = " << selector(s + ";")->minus(selector(t + ";"), ctx)->perform(&to_string) << endl;
20
+ }
21
+
22
+ int main()
23
+ {
24
+ diff(".a.b.c", ".c.b");
25
+ diff(".a.b.c", ".fludge.b");
26
+
27
+ return 0;
28
+ }
@@ -0,0 +1,28 @@
1
+ #include "../ast.hpp"
2
+ #include "../context.hpp"
3
+ #include "../parser.hpp"
4
+ #include "../to_string.hpp"
5
+ #include <string>
6
+ #include <iostream>
7
+
8
+ using namespace std;
9
+ using namespace Sass;
10
+
11
+ Context ctx = Context::Data();
12
+ To_String to_string;
13
+
14
+ Selector* selector(string src)
15
+ { return Parser::from_c_str(src.c_str(), ctx, "", Position()).parse_selector_group(); }
16
+
17
+ void spec(string sel)
18
+ { cout << sel << "\t::\t" << selector(sel + ";")->specificity() << endl; }
19
+
20
+ int main()
21
+ {
22
+ spec("foo bar hux");
23
+ spec(".foo .bar hux");
24
+ spec("#foo .bar[hux='mux']");
25
+ spec("a b c d e f");
26
+
27
+ return 0;
28
+ }
@@ -0,0 +1,472 @@
1
+ #include <string>
2
+ #include <iostream>
3
+ #include <assert.h>
4
+ #include "../subset_map.hpp"
5
+
6
+ Subset_Map<string, string> ssm;
7
+
8
+ string toString(vector<string> v);
9
+ string toString(vector<pair<string, vector<string>>> v);
10
+ void assertEqual(string sExpected, string sResult);
11
+
12
+ void setup() {
13
+ ssm.clear();
14
+
15
+ //@ssm[Set[1, 2]] = "Foo"
16
+ vector<string> s1;
17
+ s1.push_back("1");
18
+ s1.push_back("2");
19
+ ssm.put(s1, "Foo");
20
+
21
+ //@ssm[Set["fizz", "fazz"]] = "Bar"
22
+ vector<string> s2;
23
+ s2.push_back("fizz");
24
+ s2.push_back("fazz");
25
+ ssm.put(s2, "Bar");
26
+
27
+ //@ssm[Set[:foo, :bar]] = "Baz"
28
+ vector<string> s3;
29
+ s3.push_back(":foo");
30
+ s3.push_back(":bar");
31
+ ssm.put(s3, "Baz");
32
+
33
+ //@ssm[Set[:foo, :bar, :baz]] = "Bang"
34
+ vector<string> s4;
35
+ s4.push_back(":foo");
36
+ s4.push_back(":bar");
37
+ s4.push_back(":baz");
38
+ ssm.put(s4, "Bang");
39
+
40
+ //@ssm[Set[:bip, :bop, :blip]] = "Qux"
41
+ vector<string> s5;
42
+ s5.push_back(":bip");
43
+ s5.push_back(":bop");
44
+ s5.push_back(":blip");
45
+ ssm.put(s5, "Qux");
46
+
47
+ //@ssm[Set[:bip, :bop]] = "Thram"
48
+ vector<string> s6;
49
+ s6.push_back(":bip");
50
+ s6.push_back(":bop");
51
+ ssm.put(s6, "Thram");
52
+ }
53
+
54
+ void testEqualKeys() {
55
+ cout << "testEqualKeys" << endl;
56
+
57
+ //assert_equal [["Foo", Set[1, 2]]], @ssm.get(Set[1, 2])
58
+ vector<string> k1;
59
+ k1.push_back("1");
60
+ k1.push_back("2");
61
+ assertEqual("[[Foo, Set[1, 2]]]", toString(ssm.get_kv(k1)));
62
+
63
+ //assert_equal [["Bar", Set["fizz", "fazz"]]], @ssm.get(Set["fizz", "fazz"])
64
+ vector<string> k2;
65
+ k2.push_back("fizz");
66
+ k2.push_back("fazz");
67
+ assertEqual("[[Bar, Set[fizz, fazz]]]", toString(ssm.get_kv(k2)));
68
+
69
+ cout << endl;
70
+ }
71
+
72
+ void testSubsetKeys() {
73
+ cout << "testSubsetKeys" << endl;
74
+
75
+ //assert_equal [["Foo", Set[1, 2]]], @ssm.get(Set[1, 2, "fuzz"])
76
+ vector<string> k1;
77
+ k1.push_back("1");
78
+ k1.push_back("2");
79
+ k1.push_back("fuzz");
80
+ assertEqual("[[Foo, Set[1, 2]]]", toString(ssm.get_kv(k1)));
81
+
82
+ //assert_equal [["Bar", Set["fizz", "fazz"]]], @ssm.get(Set["fizz", "fazz", 3])
83
+ vector<string> k2;
84
+ k2.push_back("fizz");
85
+ k2.push_back("fazz");
86
+ k2.push_back("3");
87
+ assertEqual("[[Bar, Set[fizz, fazz]]]", toString(ssm.get_kv(k2)));
88
+
89
+ cout << endl;
90
+ }
91
+
92
+ void testSupersetKeys() {
93
+ cout << "testSupersetKeys" << endl;
94
+
95
+ //assert_equal [], @ssm.get(Set[1])
96
+ vector<string> k1;
97
+ k1.push_back("1");
98
+ assertEqual("[]", toString(ssm.get_kv(k1)));
99
+
100
+ //assert_equal [], @ssm.get(Set[2])
101
+ vector<string> k2;
102
+ k2.push_back("2");
103
+ assertEqual("[]", toString(ssm.get_kv(k2)));
104
+
105
+ //assert_equal [], @ssm.get(Set["fizz"])
106
+ vector<string> k3;
107
+ k3.push_back("fizz");
108
+ assertEqual("[]", toString(ssm.get_kv(k3)));
109
+
110
+ //assert_equal [], @ssm.get(Set["fazz"])
111
+ vector<string> k4;
112
+ k4.push_back("fazz");
113
+ assertEqual("[]", toString(ssm.get_kv(k4)));
114
+
115
+ cout << endl;
116
+ }
117
+
118
+ void testDisjointKeys() {
119
+ cout << "testDisjointKeys" << endl;
120
+
121
+ //assert_equal [], @ssm.get(Set[3, 4])
122
+ vector<string> k1;
123
+ k1.push_back("3");
124
+ k1.push_back("4");
125
+ assertEqual("[]", toString(ssm.get_kv(k1)));
126
+
127
+ //assert_equal [], @ssm.get(Set["fuzz", "frizz"])
128
+ vector<string> k2;
129
+ k2.push_back("fuzz");
130
+ k2.push_back("frizz");
131
+ assertEqual("[]", toString(ssm.get_kv(k2)));
132
+
133
+ //assert_equal [], @ssm.get(Set["gran", 15])
134
+ vector<string> k3;
135
+ k3.push_back("gran");
136
+ k3.push_back("15");
137
+ assertEqual("[]", toString(ssm.get_kv(k3)));
138
+
139
+ cout << endl;
140
+ }
141
+
142
+ void testSemiDisjointKeys() {
143
+ cout << "testSemiDisjointKeys" << endl;
144
+
145
+ //assert_equal [], @ssm.get(Set[2, 3])
146
+ vector<string> k1;
147
+ k1.push_back("2");
148
+ k1.push_back("3");
149
+ assertEqual("[]", toString(ssm.get_kv(k1)));
150
+
151
+ //assert_equal [], @ssm.get(Set["fizz", "fuzz"])
152
+ vector<string> k2;
153
+ k2.push_back("fizz");
154
+ k2.push_back("fuzz");
155
+ assertEqual("[]", toString(ssm.get_kv(k2)));
156
+
157
+ //assert_equal [], @ssm.get(Set[1, "fazz"])
158
+ vector<string> k3;
159
+ k3.push_back("1");
160
+ k3.push_back("fazz");
161
+ assertEqual("[]", toString(ssm.get_kv(k3)));
162
+
163
+ cout << endl;
164
+ }
165
+
166
+ void testEmptyKeySet() {
167
+ cout << "testEmptyKeySet" << endl;
168
+
169
+ //assert_raises(ArgumentError) {@ssm[Set[]] = "Fail"}
170
+ vector<string> s1;
171
+ try {
172
+ ssm.put(s1, "Fail");
173
+ }
174
+ catch (const char* &e) {
175
+ assertEqual("internal error: subset map keys may not be empty", e);
176
+ }
177
+ }
178
+
179
+ void testEmptyKeyGet() {
180
+ cout << "testEmptyKeyGet" << endl;
181
+
182
+ //assert_equal [], @ssm.get(Set[])
183
+ vector<string> k1;
184
+ assertEqual("[]", toString(ssm.get_kv(k1)));
185
+
186
+ cout << endl;
187
+ }
188
+ void testMultipleSubsets() {
189
+ cout << "testMultipleSubsets" << endl;
190
+
191
+ //assert_equal [["Foo", Set[1, 2]], ["Bar", Set["fizz", "fazz"]]], @ssm.get(Set[1, 2, "fizz", "fazz"])
192
+ vector<string> k1;
193
+ k1.push_back("1");
194
+ k1.push_back("2");
195
+ k1.push_back("fizz");
196
+ k1.push_back("fazz");
197
+ assertEqual("[[Foo, Set[1, 2]], [Bar, Set[fizz, fazz]]]", toString(ssm.get_kv(k1)));
198
+
199
+ //assert_equal [["Foo", Set[1, 2]], ["Bar", Set["fizz", "fazz"]]], @ssm.get(Set[1, 2, 3, "fizz", "fazz", "fuzz"])
200
+ vector<string> k2;
201
+ k2.push_back("1");
202
+ k2.push_back("2");
203
+ k2.push_back("3");
204
+ k2.push_back("fizz");
205
+ k2.push_back("fazz");
206
+ k2.push_back("fuzz");
207
+ assertEqual("[[Foo, Set[1, 2]], [Bar, Set[fizz, fazz]]]", toString(ssm.get_kv(k2)));
208
+
209
+ //assert_equal [["Baz", Set[:foo, :bar]]], @ssm.get(Set[:foo, :bar])
210
+ vector<string> k3;
211
+ k3.push_back(":foo");
212
+ k3.push_back(":bar");
213
+ assertEqual("[[Baz, Set[:foo, :bar]]]", toString(ssm.get_kv(k3)));
214
+
215
+ //assert_equal [["Baz", Set[:foo, :bar]], ["Bang", Set[:foo, :bar, :baz]]], @ssm.get(Set[:foo, :bar, :baz])
216
+ vector<string> k4;
217
+ k4.push_back(":foo");
218
+ k4.push_back(":bar");
219
+ k4.push_back(":baz");
220
+ assertEqual("[[Baz, Set[:foo, :bar]], [Bang, Set[:foo, :bar, :baz]]]", toString(ssm.get_kv(k4)));
221
+
222
+ cout << endl;
223
+ }
224
+ void testBracketBracket() {
225
+ cout << "testBracketBracket" << endl;
226
+
227
+ //assert_equal ["Foo"], @ssm[Set[1, 2, "fuzz"]]
228
+ vector<string> k1;
229
+ k1.push_back("1");
230
+ k1.push_back("2");
231
+ k1.push_back("fuzz");
232
+ assertEqual("[Foo]", toString(ssm.get_v(k1)));
233
+
234
+ //assert_equal ["Baz", "Bang"], @ssm[Set[:foo, :bar, :baz]]
235
+ vector<string> k2;
236
+ k2.push_back(":foo");
237
+ k2.push_back(":bar");
238
+ k2.push_back(":baz");
239
+ assertEqual("[Baz, Bang]", toString(ssm.get_v(k2)));
240
+
241
+ cout << endl;
242
+ }
243
+
244
+ void testKeyOrder() {
245
+ cout << "testEqualKeys" << endl;
246
+
247
+ //assert_equal [["Foo", Set[1, 2]]], @ssm.get(Set[2, 1])
248
+ vector<string> k1;
249
+ k1.push_back("2");
250
+ k1.push_back("1");
251
+ assertEqual("[[Foo, Set[1, 2]]]", toString(ssm.get_kv(k1)));
252
+
253
+ cout << endl;
254
+ }
255
+
256
+ void testOrderPreserved() {
257
+ cout << "testOrderPreserved" << endl;
258
+ //@ssm[Set[10, 11, 12]] = 1
259
+ vector<string> s1;
260
+ s1.push_back("10");
261
+ s1.push_back("11");
262
+ s1.push_back("12");
263
+ ssm.put(s1, "1");
264
+
265
+ //@ssm[Set[10, 11]] = 2
266
+ vector<string> s2;
267
+ s2.push_back("10");
268
+ s2.push_back("11");
269
+ ssm.put(s2, "2");
270
+
271
+ //@ssm[Set[11]] = 3
272
+ vector<string> s3;
273
+ s3.push_back("11");
274
+ ssm.put(s3, "3");
275
+
276
+ //@ssm[Set[11, 12]] = 4
277
+ vector<string> s4;
278
+ s4.push_back("11");
279
+ s4.push_back("12");
280
+ ssm.put(s4, "4");
281
+
282
+ //@ssm[Set[9, 10, 11, 12, 13]] = 5
283
+ vector<string> s5;
284
+ s5.push_back("9");
285
+ s5.push_back("10");
286
+ s5.push_back("11");
287
+ s5.push_back("12");
288
+ s5.push_back("13");
289
+ ssm.put(s5, "5");
290
+
291
+ //@ssm[Set[10, 13]] = 6
292
+ vector<string> s6;
293
+ s6.push_back("10");
294
+ s6.push_back("13");
295
+ ssm.put(s6, "6");
296
+
297
+ //assert_equal([[1, Set[10, 11, 12]], [2, Set[10, 11]], [3, Set[11]], [4, Set[11, 12]], [5, Set[9, 10, 11, 12, 13]], [6, Set[10, 13]]], @ssm.get(Set[9, 10, 11, 12, 13]))
298
+ vector<string> k1;
299
+ k1.push_back("9");
300
+ k1.push_back("10");
301
+ k1.push_back("11");
302
+ k1.push_back("12");
303
+ k1.push_back("13");
304
+ assertEqual("[[1, Set[10, 11, 12]], [2, Set[10, 11]], [3, Set[11]], [4, Set[11, 12]], [5, Set[9, 10, 11, 12, 13]], [6, Set[10, 13]]]", toString(ssm.get_kv(k1)));
305
+
306
+ cout << endl;
307
+ }
308
+ void testMultipleEqualValues() {
309
+ cout << "testMultipleEqualValues" << endl;
310
+ //@ssm[Set[11, 12]] = 1
311
+ vector<string> s1;
312
+ s1.push_back("11");
313
+ s1.push_back("12");
314
+ ssm.put(s1, "1");
315
+
316
+ //@ssm[Set[12, 13]] = 2
317
+ vector<string> s2;
318
+ s2.push_back("12");
319
+ s2.push_back("13");
320
+ ssm.put(s2, "2");
321
+
322
+ //@ssm[Set[13, 14]] = 1
323
+ vector<string> s3;
324
+ s3.push_back("13");
325
+ s3.push_back("14");
326
+ ssm.put(s3, "1");
327
+
328
+ //@ssm[Set[14, 15]] = 1
329
+ vector<string> s4;
330
+ s4.push_back("14");
331
+ s4.push_back("15");
332
+ ssm.put(s4, "1");
333
+
334
+ //assert_equal([[1, Set[11, 12]], [2, Set[12, 13]], [1, Set[13, 14]], [1, Set[14, 15]]], @ssm.get(Set[11, 12, 13, 14, 15]))
335
+ vector<string> k1;
336
+ k1.push_back("11");
337
+ k1.push_back("12");
338
+ k1.push_back("13");
339
+ k1.push_back("14");
340
+ k1.push_back("15");
341
+ assertEqual("[[1, Set[11, 12]], [2, Set[12, 13]], [1, Set[13, 14]], [1, Set[14, 15]]]", toString(ssm.get_kv(k1)));
342
+
343
+ cout << endl;
344
+ }
345
+
346
+ int main()
347
+ {
348
+ vector<string> s1;
349
+ s1.push_back("1");
350
+ s1.push_back("2");
351
+
352
+ vector<string> s2;
353
+ s2.push_back("2");
354
+ s2.push_back("3");
355
+
356
+ vector<string> s3;
357
+ s3.push_back("3");
358
+ s3.push_back("4");
359
+
360
+ ssm.put(s1, "value1");
361
+ ssm.put(s2, "value2");
362
+ ssm.put(s3, "value3");
363
+
364
+ vector<string> s4;
365
+ s4.push_back("1");
366
+ s4.push_back("2");
367
+ s4.push_back("3");
368
+
369
+ vector<pair<string, vector<string> > > fetched(ssm.get_kv(s4));
370
+
371
+ cout << "PRINTING RESULTS:" << endl;
372
+ for (size_t i = 0, S = fetched.size(); i < S; ++i) {
373
+ cout << fetched[i].first << endl;
374
+ }
375
+
376
+ Subset_Map<string, string> ssm2;
377
+ ssm2.put(s1, "foo");
378
+ ssm2.put(s2, "bar");
379
+ ssm2.put(s4, "hux");
380
+
381
+ vector<pair<string, vector<string> > > fetched2(ssm2.get_kv(s4));
382
+
383
+ cout << endl << "PRINTING RESULTS:" << endl;
384
+ for (size_t i = 0, S = fetched2.size(); i < S; ++i) {
385
+ cout << fetched2[i].first << endl;
386
+ }
387
+
388
+ cout << "TRYING ON A SELECTOR-LIKE OBJECT" << endl;
389
+
390
+ Subset_Map<string, string> sel_ssm;
391
+ vector<string> target;
392
+ target.push_back("desk");
393
+ target.push_back(".wood");
394
+
395
+ vector<string> actual;
396
+ actual.push_back("desk");
397
+ actual.push_back(".wood");
398
+ actual.push_back(".mine");
399
+
400
+ sel_ssm.put(target, "has-aquarium");
401
+ vector<pair<string, vector<string> > > fetched3(sel_ssm.get_kv(actual));
402
+ cout << "RESULTS:" << endl;
403
+ for (size_t i = 0, S = fetched3.size(); i < S; ++i) {
404
+ cout << fetched3[i].first << endl;
405
+ }
406
+
407
+ cout << endl;
408
+
409
+ // BEGIN PORTED RUBY TESTS FROM /test/sass/util/subset_map_test.rb
410
+
411
+ setup();
412
+ testEqualKeys();
413
+ testSubsetKeys();
414
+ testSupersetKeys();
415
+ testDisjointKeys();
416
+ testSemiDisjointKeys();
417
+ testEmptyKeySet();
418
+ testEmptyKeyGet();
419
+ testMultipleSubsets();
420
+ testBracketBracket();
421
+ testKeyOrder();
422
+
423
+ setup();
424
+ testOrderPreserved();
425
+
426
+ setup();
427
+ testMultipleEqualValues();
428
+
429
+ return 0;
430
+ }
431
+
432
+ string toString(vector<pair<string, vector<string>>> v)
433
+ {
434
+ stringstream buffer;
435
+ buffer << "[";
436
+ for (size_t i = 0, S = v.size(); i < S; ++i) {
437
+ buffer << "[" << v[i].first;
438
+ buffer << ", Set[";
439
+ for (size_t j = 0, S = v[i].second.size(); j < S; ++j) {
440
+ buffer << v[i].second[j];
441
+ if (j < S-1) {
442
+ buffer << ", ";
443
+ }
444
+ }
445
+ buffer << "]]";
446
+ if (i < S-1) {
447
+ buffer << ", ";
448
+ }
449
+ }
450
+ buffer << "]";
451
+ return buffer.str();
452
+ }
453
+
454
+ string toString(vector<string> v)
455
+ {
456
+ stringstream buffer;
457
+ buffer << "[";
458
+ for (size_t i = 0, S = v.size(); i < S; ++i) {
459
+ buffer << v[i];
460
+ if (i < S-1) {
461
+ buffer << ", ";
462
+ }
463
+ }
464
+ buffer << "]";
465
+ return buffer.str();
466
+ }
467
+
468
+ void assertEqual(string sExpected, string sResult) {
469
+ cout << "Expected: " << sExpected << endl;
470
+ cout << "Result: " << sResult << endl;
471
+ assert(sExpected == sResult);
472
+ }