|
@@ -17,6 +17,65 @@ test('attribute bindings are set on initialize', async () => {
|
|
|
expect(document.querySelector('span').getAttribute('foo')).toEqual('bar')
|
|
|
})
|
|
|
|
|
|
+test('class attribute bindings are merged by string syntax', async () => {
|
|
|
+ document.body.innerHTML = `
|
|
|
+ <div x-data="{ isOn: false }">
|
|
|
+ <span class="foo" x-bind:class="isOn ? 'bar': ''"></span>
|
|
|
+
|
|
|
+ <button @click="isOn = ! isOn"></button>
|
|
|
+ </div>
|
|
|
+ `
|
|
|
+ Alpine.start()
|
|
|
+
|
|
|
+ expect(document.querySelector('span').classList.contains('foo')).toBeTruthy()
|
|
|
+ expect(document.querySelector('span').classList.contains('bar')).toBeFalsy()
|
|
|
+
|
|
|
+ document.querySelector('button').click()
|
|
|
+
|
|
|
+ await wait(() => {
|
|
|
+ expect(document.querySelector('span').classList.contains('foo')).toBeTruthy()
|
|
|
+ expect(document.querySelector('span').classList.contains('bar')).toBeTruthy()
|
|
|
+ })
|
|
|
+
|
|
|
+ document.querySelector('button').click()
|
|
|
+
|
|
|
+ await wait(() => {
|
|
|
+ expect(document.querySelector('span').classList.contains('foo')).toBeTruthy()
|
|
|
+ expect(document.querySelector('span').classList.contains('bar')).toBeFalsy()
|
|
|
+ })
|
|
|
+})
|
|
|
+
|
|
|
+test('class attribute bindings are merged by array syntax', async () => {
|
|
|
+ document.body.innerHTML = `
|
|
|
+ <div x-data="{ isOn: false }">
|
|
|
+ <span class="foo" x-bind:class="isOn ? ['bar', 'baz']: ['bar']"></span>
|
|
|
+
|
|
|
+ <button @click="isOn = ! isOn"></button>
|
|
|
+ </div>
|
|
|
+ `
|
|
|
+ Alpine.start()
|
|
|
+
|
|
|
+ expect(document.querySelector('span').classList.contains('foo')).toBeTruthy()
|
|
|
+ expect(document.querySelector('span').classList.contains('bar')).toBeTruthy()
|
|
|
+ expect(document.querySelector('span').classList.contains('baz')).toBeFalsy()
|
|
|
+
|
|
|
+ document.querySelector('button').click()
|
|
|
+
|
|
|
+ await wait(() => {
|
|
|
+ expect(document.querySelector('span').classList.contains('foo')).toBeTruthy()
|
|
|
+ expect(document.querySelector('span').classList.contains('bar')).toBeTruthy()
|
|
|
+ expect(document.querySelector('span').classList.contains('baz')).toBeTruthy()
|
|
|
+ })
|
|
|
+
|
|
|
+ document.querySelector('button').click()
|
|
|
+
|
|
|
+ await wait(() => {
|
|
|
+ expect(document.querySelector('span').classList.contains('foo')).toBeTruthy()
|
|
|
+ expect(document.querySelector('span').classList.contains('bar')).toBeTruthy()
|
|
|
+ expect(document.querySelector('span').classList.contains('baz')).toBeFalsy()
|
|
|
+ })
|
|
|
+})
|
|
|
+
|
|
|
test('class attribute bindings are removed by object syntax', async () => {
|
|
|
document.body.innerHTML = `
|
|
|
<div x-data="{ isOn: false }">
|
|
@@ -29,6 +88,18 @@ test('class attribute bindings are removed by object syntax', async () => {
|
|
|
expect(document.querySelector('span').classList.contains('foo')).toBeFalsy()
|
|
|
})
|
|
|
|
|
|
+test('class attribute bindings are added by string syntax', async () => {
|
|
|
+ document.body.innerHTML = `
|
|
|
+ <div x-data="{ initialClass: 'foo' }">
|
|
|
+ <span x-bind:class="initialClass"></span>
|
|
|
+ </div>
|
|
|
+ `
|
|
|
+
|
|
|
+ Alpine.start()
|
|
|
+
|
|
|
+ expect(document.querySelector('span').classList.contains('foo')).toBeTruthy()
|
|
|
+})
|
|
|
+
|
|
|
test('class attribute bindings are added by object syntax', async () => {
|
|
|
document.body.innerHTML = `
|
|
|
<div x-data="{ isOn: true }">
|
|
@@ -79,18 +150,6 @@ test('class attribute bindings are added by nested object syntax', async () => {
|
|
|
expect(document.querySelector('span').classList.contains('foo')).toBeTruthy()
|
|
|
})
|
|
|
|
|
|
-test('class attribute bindings are removed by array syntax', async () => {
|
|
|
- document.body.innerHTML = `
|
|
|
- <div x-data="{}">
|
|
|
- <span class="foo" x-bind:class="[]"></span>
|
|
|
- </div>
|
|
|
- `
|
|
|
-
|
|
|
- Alpine.start()
|
|
|
-
|
|
|
- expect(document.querySelector('span').classList.contains('foo')).toBeFalsy()
|
|
|
-})
|
|
|
-
|
|
|
test('class attribute bindings are added by array syntax', async () => {
|
|
|
document.body.innerHTML = `
|
|
|
<div x-data="{}">
|