1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
27
  
28
  
29
  
30
  
31
  
32
  
33
  
34
  
35
  
36
  
37
  
38
  
39
  
40
  
41
  
42
  
43
  
44
  
45
  
46
  
47
  
48
  
49
  
50
  
51
  
52
  
53
  
54
  
55
  
56
  
57
  
58
  
59
  
60
  
61
  
62
  
63
  
64
  
65
  
66
  
67
  
68
  
69
  
70
  
71
  
#include "../ast.hpp" 
#include "../context.hpp" 
#include "../parser.hpp" 
#include <string> 
 
using namespace Sass; 
 
Context ctx = Context(Context::Data()); 
 
Compound_Selector* compound_selector(std::string src) 
{ return Parser::from_c_str(src.c_str(), ctx, "", Position()).parse_compound_selector(); } 
 
Complex_Selector* complex_selector(std::string src) 
{ return Parser::from_c_str(src.c_str(), ctx, "", Position()).parse_complex_selector(false); } 
 
void check_compound(std::string s1, std::string s2) 
{ 
  std::cout << "Is " 
       << s1 
       << " a superselector of " 
       << s2 
       << "?\t" 
       << compound_selector(s1 + ";")->is_superselector_of(compound_selector(s2 + ";")) 
       << std::endl; 
} 
 
void check_complex(std::string s1, std::string s2) 
{ 
  std::cout << "Is " 
       << s1 
       << " a superselector of " 
       << s2 
       << "?\t" 
       << complex_selector(s1 + ";")->is_superselector_of(complex_selector(s2 + ";")) 
       << std::endl; 
} 
 
int main() 
{ 
  check_compound(".foo", ".foo.bar"); 
  check_compound(".foo.bar", ".foo"); 
  check_compound(".foo.bar", "div.foo"); 
  check_compound(".foo", "div.foo"); 
  check_compound("div.foo", ".foo"); 
  check_compound("div.foo", "div.bar.foo"); 
  check_compound("p.foo", "div.bar.foo"); 
  check_compound(".hux", ".mumble"); 
 
  std::cout << std::endl; 
 
  check_complex(".foo ~ .bar", ".foo + .bar"); 
  check_complex(".foo .bar", ".foo + .bar"); 
  check_complex(".foo .bar", ".foo > .bar"); 
  check_complex(".foo .bar > .hux", ".foo.a .bar.b > .hux"); 
  check_complex(".foo ~ .bar .hux", ".foo.a + .bar.b > .hux"); 
  check_complex(".foo", ".bar .foo"); 
  check_complex(".foo", ".foo.a"); 
  check_complex(".foo.bar", ".foo"); 
  check_complex(".foo .bar .hux", ".bar .hux"); 
  check_complex(".foo ~ .bar .hux.x", ".foo.a + .bar.b > .hux.y"); 
  check_complex(".foo ~ .bar .hux", ".foo.a + .bar.b > .mumble"); 
  check_complex(".foo + .bar", ".foo ~ .bar"); 
  check_complex("a c e", "a b c d e"); 
  check_complex("c a e", "a b c d e"); 
 
  return 0; 
}