| 1 | module html |
| 2 | |
| 3 | import strings |
| 4 | |
| 5 | fn generate_temp_html() string { |
| 6 | mut temp_html := strings.new_builder(200) |
| 7 | temp_html.write_string('<!doctype html><html><head><title>Giant String</title></head><body>') |
| 8 | for counter := 0; counter < 4; counter++ { |
| 9 | temp_html.write_string("<div id='name_${counter}' ") |
| 10 | temp_html.write_string("class='several-${counter}'>Look at ${counter}</div>") |
| 11 | } |
| 12 | temp_html.write_string('</body></html>') |
| 13 | return temp_html.str() |
| 14 | } |
| 15 | |
| 16 | fn test_search_by_tag_type() { |
| 17 | dom := parse(generate_temp_html()) |
| 18 | assert dom.get_tags(name: 'div').len == 4 |
| 19 | assert dom.get_tags(name: 'head').len == 1 |
| 20 | assert dom.get_tags(name: 'body').len == 1 |
| 21 | } |
| 22 | |
| 23 | fn test_search_by_attribute_value() { |
| 24 | mut dom := parse(generate_temp_html()) |
| 25 | // println(temp_html) |
| 26 | print('Amount ') |
| 27 | println(dom.get_tags_by_attribute_value('id', 'name_0')) |
| 28 | assert dom.get_tags_by_attribute_value('id', 'name_0').len == 1 |
| 29 | } |
| 30 | |
| 31 | fn test_access_parent() { |
| 32 | mut dom := parse(generate_temp_html()) |
| 33 | div_tags := dom.get_tags(name: 'div') |
| 34 | parent := div_tags[0].parent |
| 35 | assert unsafe { parent != 0 } |
| 36 | for div_tag in div_tags { |
| 37 | assert div_tag.parent == parent |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | fn test_search_by_attributes() { |
| 42 | dom := parse(generate_temp_html()) |
| 43 | assert dom.get_tags_by_attribute('id').len == 4 |
| 44 | } |
| 45 | |
| 46 | fn test_tags_used() { |
| 47 | dom := parse(generate_temp_html()) |
| 48 | assert dom.get_tags().len == 9 |
| 49 | } |
| 50 | |
| 51 | fn test_access_tag_fields() { |
| 52 | dom := parse(generate_temp_html()) |
| 53 | id_tags := dom.get_tags_by_attribute('id') |
| 54 | assert id_tags[0].name == 'div' |
| 55 | assert id_tags[1].attributes['class'] == 'several-1' |
| 56 | } |
| 57 | |
| 58 | fn generate_temp_html_with_classes() string { |
| 59 | mut temp_html := strings.new_builder(400) |
| 60 | temp_html.write_string('<!doctype html><html><head><title>Giant String</title></head><body>') |
| 61 | temp_html.write_string("<div class='single'>Single</div>") |
| 62 | for counter := 0; counter < 4; counter++ { |
| 63 | temp_html.write_string("<div id='name_${counter}' ") |
| 64 | temp_html.write_string("class='common'>Common No. ${counter}</div>") |
| 65 | } |
| 66 | temp_html.write_string("<div class='complex-0 complex-1 complex-2'>Complex</div>") |
| 67 | temp_html.write_string("<div class='complex-0 complex-2'>Partial</div>") |
| 68 | temp_html.write_string('</body></html>') |
| 69 | return temp_html.str() |
| 70 | } |
| 71 | |
| 72 | fn test_search_by_class() { |
| 73 | dom := parse(generate_temp_html_with_classes()) |
| 74 | single_class_tags := dom.get_tags_by_class_name('single') |
| 75 | common_class_tags := dom.get_tags_by_class_name('common') |
| 76 | complex_class_tags := dom.get_tags_by_class_name('complex-0', 'complex-1', 'complex-2') |
| 77 | partial_class_tags := dom.get_tags_by_class_name('complex-0', 'complex-2') |
| 78 | shuffled_class_tags := dom.get_tags_by_class_name('complex-2', 'complex-0', 'complex-1') |
| 79 | assert single_class_tags.len == 1 |
| 80 | assert common_class_tags.len == 4 |
| 81 | assert complex_class_tags.len == 1 |
| 82 | assert complex_class_tags[0].attributes['class'] == 'complex-0 complex-1 complex-2' |
| 83 | assert partial_class_tags.len == 2 |
| 84 | assert shuffled_class_tags.len == 1 |
| 85 | assert shuffled_class_tags[0].attributes['class'] == 'complex-0 complex-1 complex-2' |
| 86 | } |
| 87 | |
| 88 | fn test_unmatched_close_tag_is_ignored() { |
| 89 | content := '<!doctype html><html><body><div><a href="#">x</a></a></div><article class="news-post">hello</article></body></html>' |
| 90 | mut dom := parse(content) |
| 91 | by_attr := dom.get_tags_by_attribute_value('class', 'news-post') |
| 92 | by_class := dom.get_tags_by_class_name('news-post') |
| 93 | assert by_attr.len == 1 |
| 94 | assert by_class.len == 1 |
| 95 | assert by_class[0].name == 'article' |
| 96 | } |
| 97 | |