@@ -39,3 +39,157 @@ class AttributeFolderHTMLTest : BaseAttributeFolderTest() {
3939 setupDocument(" test.html" , HTML_SNIPPET )
4040 }
4141}
42+
43+ /* *
44+ * Tests for folding method 1 (name-only placeholder).
45+ */
46+ class AttributeFolderHTMLMethod1Test : BaseAttributeFolderTest () {
47+ fun testFoldingMethod1ReplacesEntireAttribute () {
48+ setupDocument(" method1.html" , """ <div class="a b" id="main" />""" )
49+ val state = AttributeFolderState .instance
50+ state.attributes = arrayListOf (" class" )
51+ state.foldingMethod = 1
52+ state.collapseByDefault = true
53+ state.placeholder = " __PLACEHOLDER__"
54+
55+ val visualText = applyPluginFoldingAndRender()
56+ // Method 1 folds the entire attribute and uses the attribute name as placeholder
57+ assertContains(visualText, " class" )
58+ // The value "a b" should be hidden
59+ kotlin.test.assertFalse(
60+ visualText.contains(""" class="a b"""" ),
61+ " Expected the full attribute to be folded, but found it in: $visualText "
62+ )
63+ // id should remain untouched
64+ assertContains(visualText, """ id="main"""" )
65+ }
66+
67+ fun testFoldingMethod1UncollapsedShowsFullAttribute () {
68+ setupDocument(" method1u.html" , """ <div class="a b" />""" )
69+ val state = AttributeFolderState .instance
70+ state.attributes = arrayListOf (" class" )
71+ state.foldingMethod = 1
72+ state.collapseByDefault = false
73+ state.placeholder = " __PLACEHOLDER__"
74+
75+ val visualText = applyPluginFoldingAndRender()
76+ assertContains(visualText, """ class="a b"""" )
77+ }
78+ }
79+
80+ /* *
81+ * Tests for single-quoted attribute values.
82+ */
83+ class AttributeFolderHTMLSingleQuoteTest : BaseAttributeFolderTest () {
84+ fun testFoldingSingleQuotedAttributes () {
85+ setupDocument(" sq.html" , """ <div class='foo bar' />""" )
86+ configureAttributeFolder(collapseByDefault = true )
87+
88+ val visualText = applyPluginFoldingAndRender()
89+ assertContains(visualText, """ class='__PLACEHOLDER__'""" )
90+ }
91+
92+ fun testFoldingSingleQuotedUncollapsed () {
93+ setupDocument(" squ.html" , """ <div class='foo bar' />""" )
94+ configureAttributeFolder(collapseByDefault = false )
95+
96+ val visualText = applyPluginFoldingAndRender()
97+ assertContains(visualText, """ class='foo bar'""" )
98+ }
99+ }
100+
101+ /* *
102+ * Tests for custom attribute lists (e.g. data-foo).
103+ */
104+ class AttributeFolderHTMLCustomAttributeTest : BaseAttributeFolderTest () {
105+ fun testFoldingCustomAttributeInList () {
106+ setupDocument(" custom.html" , """ <div data-foo="bar baz" class="x" />""" )
107+ configureAttributeFolder(collapseByDefault = true , arrayListOf (" data-foo" ))
108+
109+ val visualText = applyPluginFoldingAndRender()
110+ assertContains(visualText, """ data-foo="__PLACEHOLDER__"""" )
111+ // class is NOT in the fold list, so it should remain
112+ assertContains(visualText, """ class="x"""" )
113+ }
114+ }
115+
116+ /* *
117+ * Tests for attributes without values (e.g. disabled).
118+ */
119+ class AttributeFolderHTMLNoValueAttributeTest : BaseAttributeFolderTest () {
120+ fun testAttributeWithoutValueIsSkipped () {
121+ setupDocument(" noval.html" , """ <input disabled class="btn" />""" )
122+ configureAttributeFolder(collapseByDefault = true )
123+
124+ val visualText = applyPluginFoldingAndRender()
125+ // disabled has no =, so it should remain as-is
126+ assertContains(visualText, " disabled" )
127+ // class should be folded
128+ assertContains(visualText, """ class="__PLACEHOLDER__"""" )
129+ }
130+ }
131+
132+ /* *
133+ * Tests for multiple sibling elements.
134+ */
135+ class AttributeFolderHTMLMultipleElementsTest : BaseAttributeFolderTest () {
136+ fun testFoldingMultipleSiblingElements () {
137+ setupDocument(" multi.html" , """ <div class="a"><span class="b">text</span></div><div class="c" />""" )
138+ configureAttributeFolder(collapseByDefault = true )
139+
140+ val visualText = applyPluginFoldingAndRender()
141+ assertContains(visualText, """ class="__PLACEHOLDER__""" , " first div class" )
142+ // Check that all three class attributes are folded
143+ val count = Regex (""" class="__PLACEHOLDER__"""" ).findAll(visualText).count()
144+ kotlin.test.assertEquals(3 , count, " Expected 3 folded class attributes, got $count in: $visualText " )
145+ }
146+ }
147+
148+ /* *
149+ * Tests for nested elements.
150+ */
151+ class AttributeFolderHTMLNestedElementsTest : BaseAttributeFolderTest () {
152+ fun testFoldingNestedElements () {
153+ setupDocument(" nested.html" , """ <div class="outer"><span class="inner">hello</span></div>""" )
154+ configureAttributeFolder(collapseByDefault = true )
155+
156+ val visualText = applyPluginFoldingAndRender()
157+ assertContains(visualText, """ class="__PLACEHOLDER__""" )
158+ // Both outer and inner should be folded
159+ val count = Regex (""" class="__PLACEHOLDER__"""" ).findAll(visualText).count()
160+ kotlin.test.assertEquals(2 , count, " Expected 2 folded class attributes in nested elements, got $count in: $visualText " )
161+ }
162+ }
163+
164+ /* *
165+ * Tests for empty attribute values.
166+ */
167+ class AttributeFolderHTMLEmptyValueTest : BaseAttributeFolderTest () {
168+ fun testFoldingEmptyAttributeValue () {
169+ setupDocument(" empty.html" , """ <div class="" />""" )
170+ configureAttributeFolder(collapseByDefault = true )
171+
172+ val visualText = applyPluginFoldingAndRender()
173+ // Empty value: start == end, so no fold region should be created.
174+ // The attribute should remain as-is.
175+ assertContains(visualText, """ class=""""" )
176+ }
177+ }
178+
179+ /* *
180+ * Tests for whitespace around = in attributes.
181+ */
182+ class AttributeFolderHTMLWhitespaceAroundEqualsTest : BaseAttributeFolderTest () {
183+ fun testAttributeWithWhitespaceAroundEquals () {
184+ // Note: HTML parsers typically normalize this, so the PSI tree
185+ // may or may not preserve whitespace. We test that no crash occurs
186+ // and the output is reasonable.
187+ setupDocument(" ws.html" , """ <div class = "foo bar" />""" )
188+ configureAttributeFolder(collapseByDefault = true )
189+
190+ // Should not crash; behavior depends on parser normalization
191+ val visualText = applyPluginFoldingAndRender()
192+ // The text should at least contain div
193+ assertContains(visualText, " div" )
194+ }
195+ }
0 commit comments