sassc 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.gitmodules +3 -0
- data/.travis.yml +9 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +24 -0
- data/Rakefile +21 -0
- data/ext/libsass/.editorconfig +15 -0
- data/ext/libsass/.gitattributes +2 -0
- data/ext/libsass/.gitignore +61 -0
- data/ext/libsass/.travis.yml +38 -0
- data/ext/libsass/COPYING +25 -0
- data/ext/libsass/INSTALL +1 -0
- data/ext/libsass/LICENSE +25 -0
- data/ext/libsass/Makefile +223 -0
- data/ext/libsass/Makefile.am +145 -0
- data/ext/libsass/Readme.md +93 -0
- data/ext/libsass/appveyor.yml +76 -0
- data/ext/libsass/ast.cpp +581 -0
- data/ext/libsass/ast.hpp +1949 -0
- data/ext/libsass/ast_def_macros.hpp +16 -0
- data/ext/libsass/ast_factory.hpp +87 -0
- data/ext/libsass/ast_fwd_decl.hpp +72 -0
- data/ext/libsass/b64/cencode.h +32 -0
- data/ext/libsass/b64/encode.h +77 -0
- data/ext/libsass/backtrace.hpp +81 -0
- data/ext/libsass/base64vlq.cpp +43 -0
- data/ext/libsass/base64vlq.hpp +28 -0
- data/ext/libsass/bind.cpp +187 -0
- data/ext/libsass/bind.hpp +18 -0
- data/ext/libsass/cencode.c +102 -0
- data/ext/libsass/color_names.hpp +324 -0
- data/ext/libsass/configure.ac +130 -0
- data/ext/libsass/constants.cpp +144 -0
- data/ext/libsass/constants.hpp +145 -0
- data/ext/libsass/context.cpp +507 -0
- data/ext/libsass/context.hpp +150 -0
- data/ext/libsass/contextualize.cpp +157 -0
- data/ext/libsass/contextualize.hpp +65 -0
- data/ext/libsass/copy_c_str.cpp +13 -0
- data/ext/libsass/copy_c_str.hpp +5 -0
- data/ext/libsass/debug.hpp +39 -0
- data/ext/libsass/environment.hpp +75 -0
- data/ext/libsass/error_handling.cpp +28 -0
- data/ext/libsass/error_handling.hpp +28 -0
- data/ext/libsass/eval.cpp +1149 -0
- data/ext/libsass/eval.hpp +80 -0
- data/ext/libsass/expand.cpp +430 -0
- data/ext/libsass/expand.hpp +77 -0
- data/ext/libsass/extconf.rb +6 -0
- data/ext/libsass/extend.cpp +1962 -0
- data/ext/libsass/extend.hpp +50 -0
- data/ext/libsass/file.cpp +291 -0
- data/ext/libsass/file.hpp +18 -0
- data/ext/libsass/functions.cpp +1565 -0
- data/ext/libsass/functions.hpp +187 -0
- data/ext/libsass/inspect.cpp +727 -0
- data/ext/libsass/inspect.hpp +108 -0
- data/ext/libsass/json.cpp +1411 -0
- data/ext/libsass/json.hpp +117 -0
- data/ext/libsass/kwd_arg_macros.hpp +23 -0
- data/ext/libsass/m4/.gitkeep +0 -0
- data/ext/libsass/mapping.hpp +17 -0
- data/ext/libsass/memory_manager.hpp +54 -0
- data/ext/libsass/node.cpp +251 -0
- data/ext/libsass/node.hpp +122 -0
- data/ext/libsass/operation.hpp +153 -0
- data/ext/libsass/output_compressed.cpp +401 -0
- data/ext/libsass/output_compressed.hpp +95 -0
- data/ext/libsass/output_nested.cpp +364 -0
- data/ext/libsass/output_nested.hpp +108 -0
- data/ext/libsass/parser.cpp +2016 -0
- data/ext/libsass/parser.hpp +264 -0
- data/ext/libsass/paths.hpp +69 -0
- data/ext/libsass/position.hpp +22 -0
- data/ext/libsass/posix/getopt.c +562 -0
- data/ext/libsass/posix/getopt.h +95 -0
- data/ext/libsass/prelexer.cpp +688 -0
- data/ext/libsass/prelexer.hpp +513 -0
- data/ext/libsass/remove_placeholders.cpp +59 -0
- data/ext/libsass/remove_placeholders.hpp +43 -0
- data/ext/libsass/res/resource.rc +35 -0
- data/ext/libsass/sass.cpp +33 -0
- data/ext/libsass/sass.h +60 -0
- data/ext/libsass/sass2scss.cpp +834 -0
- data/ext/libsass/sass2scss.h +110 -0
- data/ext/libsass/sass_context.cpp +709 -0
- data/ext/libsass/sass_context.h +120 -0
- data/ext/libsass/sass_functions.cpp +137 -0
- data/ext/libsass/sass_functions.h +90 -0
- data/ext/libsass/sass_interface.cpp +277 -0
- data/ext/libsass/sass_interface.h +97 -0
- data/ext/libsass/sass_util.cpp +136 -0
- data/ext/libsass/sass_util.hpp +259 -0
- data/ext/libsass/sass_values.cpp +337 -0
- data/ext/libsass/sass_values.h +124 -0
- data/ext/libsass/script/bootstrap +10 -0
- data/ext/libsass/script/branding +10 -0
- data/ext/libsass/script/ci-build-libsass +72 -0
- data/ext/libsass/script/ci-install-compiler +4 -0
- data/ext/libsass/script/ci-install-deps +19 -0
- data/ext/libsass/script/ci-report-coverage +25 -0
- data/ext/libsass/script/coveralls-debug +32 -0
- data/ext/libsass/script/spec +5 -0
- data/ext/libsass/script/tap-driver +652 -0
- data/ext/libsass/script/tap-runner +1 -0
- data/ext/libsass/source_map.cpp +133 -0
- data/ext/libsass/source_map.hpp +46 -0
- data/ext/libsass/subset_map.hpp +145 -0
- data/ext/libsass/support/libsass.pc.in +11 -0
- data/ext/libsass/test-driver +127 -0
- data/ext/libsass/test/test_node.cpp +98 -0
- data/ext/libsass/test/test_paths.cpp +29 -0
- data/ext/libsass/test/test_selector_difference.cpp +28 -0
- data/ext/libsass/test/test_specificity.cpp +28 -0
- data/ext/libsass/test/test_subset_map.cpp +472 -0
- data/ext/libsass/test/test_superselector.cpp +71 -0
- data/ext/libsass/test/test_unification.cpp +33 -0
- data/ext/libsass/to_c.cpp +61 -0
- data/ext/libsass/to_c.hpp +44 -0
- data/ext/libsass/to_string.cpp +29 -0
- data/ext/libsass/to_string.hpp +32 -0
- data/ext/libsass/token.hpp +32 -0
- data/ext/libsass/units.cpp +54 -0
- data/ext/libsass/units.hpp +10 -0
- data/ext/libsass/utf8.h +34 -0
- data/ext/libsass/utf8/checked.h +327 -0
- data/ext/libsass/utf8/core.h +329 -0
- data/ext/libsass/utf8/unchecked.h +228 -0
- data/ext/libsass/utf8_string.cpp +102 -0
- data/ext/libsass/utf8_string.hpp +36 -0
- data/ext/libsass/util.cpp +189 -0
- data/ext/libsass/util.hpp +26 -0
- data/ext/libsass/win/libsass.filters +291 -0
- data/ext/libsass/win/libsass.sln +28 -0
- data/ext/libsass/win/libsass.vcxproj +255 -0
- data/lib/sassc.rb +6 -0
- data/lib/sassc/engine.rb +13 -0
- data/lib/sassc/native.rb +44 -0
- data/lib/sassc/native/native_context_api.rb +140 -0
- data/lib/sassc/native/native_functions_api.rb +41 -0
- data/lib/sassc/native/sass_input_style.rb +11 -0
- data/lib/sassc/native/sass_output_style.rb +10 -0
- data/lib/sassc/native/sass_value.rb +95 -0
- data/lib/sassc/native/string_list.rb +8 -0
- data/lib/sassc/version.rb +3 -0
- data/sassc.gemspec +43 -0
- data/test/smoke_test.rb +171 -0
- data/test/test_helper.rb +4 -0
- 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
|
+
}
|