, value: T, values?: unknown[]): void {
+ if (this.hasChanged(values)) {
+ this.values = values;
+ this.value = value;
+ for (const callback of this.listeners) {
+ callback(value);
+ }
+ }
+ }
+
+ hasChanged(values?: unknown[]) {
+ const lastValues = this.values;
+
+ if (lastValues == null || values == null) {
+ return true;
+ }
+
+ return values.some((value, i) => lastValues[i] !== value);
+ }
+ }
+);
diff --git a/test/context.test.ts b/test/context.test.ts
index 024fc3c..2ced322 100644
--- a/test/context.test.ts
+++ b/test/context.test.ts
@@ -1,4 +1,4 @@
-import { component, html, createContext, useContext, useState } from '../src/haunted.js';
+import { component, html, createContext, useContext, useState, useProvideContext } from '../src/haunted.js';
import { fixture, expect, nextFrame } from '@open-wc/testing';
describe('context', function() {
@@ -37,16 +37,25 @@ describe('context', function() {
component(ProviderWithSlots)
);
+ function CustomProvider(host) {
+ const {value} = host;
+ useProvideContext(Context, value, [value]);
+ }
+
+ customElements.define('custom-provider', component(CustomProvider));
+
let withProviderValue, withProviderUpdate;
let rootProviderValue, rootProviderUpdate;
let nestedProviderValue, nestedProviderUpdate;
let genericConsumerValue, genericConsumerUpdate;
+ let customProviderValue, customProviderUpdate;
function Tests() {
[withProviderValue, withProviderUpdate] = useState();
[rootProviderValue, rootProviderUpdate] = useState('root');
[nestedProviderValue, nestedProviderUpdate] = useState('nested');
[genericConsumerValue, genericConsumerUpdate] = useState('generic');
+ [customProviderValue, customProviderUpdate] = useState('custom');
return html`
@@ -81,6 +90,12 @@ describe('context', function() {
+
+
+
+
+
+
`;
}
@@ -122,6 +137,10 @@ describe('context', function() {
expect(getResults('#with-slotted-provider slotted-context-provider context-consumer')[0]).to.equal('slotted');
});
+ it('uses custom value when custom provider is found', async () => {
+ expect(getResults('#custom-provider context-consumer')[0]).to.equal('custom');
+ });
+
describe('with generic consumer component', function () {
it('should render template with context value', async () => {
expect(getContentResults('#generic-consumer generic-consumer')).to.deep.equal(['generic-value']);