1082815dcSEvan Baconimport { compileMockModWithResultsAsync } from '../../plugins/__tests__/mockMods';
2082815dcSEvan Baconimport { withGradleProperties } from '../../plugins/android-plugins';
3082815dcSEvan Baconimport {
4082815dcSEvan Bacon  updateAndroidBuildPropertiesFromConfig,
5082815dcSEvan Bacon  updateAndroidBuildProperty,
6082815dcSEvan Bacon  withJsEngineGradleProps,
7082815dcSEvan Bacon} from '../BuildProperties';
8082815dcSEvan Baconimport { parsePropertiesFile, PropertiesItem } from '../Properties';
9082815dcSEvan Bacon
10082815dcSEvan Baconjest.mock('../../plugins/android-plugins');
11082815dcSEvan Bacon
12*0e8f799bSKudo Chienconst HERMES_PROP_KEY = 'hermesEnabled';
13082815dcSEvan Bacon
14*0e8f799bSKudo Chiendescribe(withJsEngineGradleProps, () => {
15082815dcSEvan Bacon  it('set the property from shared `jsEngine` config', async () => {
16082815dcSEvan Bacon    const { modResults } = await compileMockModWithResultsAsync(
17082815dcSEvan Bacon      { jsEngine: 'hermes' },
18082815dcSEvan Bacon      {
19082815dcSEvan Bacon        plugin: withJsEngineGradleProps,
20082815dcSEvan Bacon        mod: withGradleProperties,
21082815dcSEvan Bacon        modResults: [],
22082815dcSEvan Bacon      }
23082815dcSEvan Bacon    );
24082815dcSEvan Bacon    expect(modResults).toContainEqual({
25082815dcSEvan Bacon      type: 'property',
26*0e8f799bSKudo Chien      key: HERMES_PROP_KEY,
27*0e8f799bSKudo Chien      value: 'true',
28082815dcSEvan Bacon    });
29082815dcSEvan Bacon  });
30082815dcSEvan Bacon
31082815dcSEvan Bacon  it('set the property from platform override `jsEngine`', async () => {
32082815dcSEvan Bacon    const { modResults } = await compileMockModWithResultsAsync(
33082815dcSEvan Bacon      { jsEngine: 'hermes', android: { jsEngine: 'jsc' } },
34082815dcSEvan Bacon      {
35082815dcSEvan Bacon        plugin: withJsEngineGradleProps,
36082815dcSEvan Bacon        mod: withGradleProperties,
37082815dcSEvan Bacon        modResults: [],
38082815dcSEvan Bacon      }
39082815dcSEvan Bacon    );
40082815dcSEvan Bacon    expect(modResults).toContainEqual({
41082815dcSEvan Bacon      type: 'property',
42*0e8f799bSKudo Chien      key: HERMES_PROP_KEY,
43*0e8f799bSKudo Chien      value: 'false',
44082815dcSEvan Bacon    });
45082815dcSEvan Bacon  });
46082815dcSEvan Bacon
47082815dcSEvan Bacon  it('overwrite the property if an old property is existed', async () => {
48082815dcSEvan Bacon    const originalGradleProperties = parsePropertiesFile(`
49082815dcSEvan Baconandroid.useAndroidX=true
50082815dcSEvan Baconandroid.enableJetifier=true
51*0e8f799bSKudo ChienhermesEnabled=false
52082815dcSEvan Bacon`);
53082815dcSEvan Bacon
54082815dcSEvan Bacon    const { modResults } = await compileMockModWithResultsAsync(
55082815dcSEvan Bacon      { android: { jsEngine: 'hermes' } },
56082815dcSEvan Bacon      {
57082815dcSEvan Bacon        plugin: withJsEngineGradleProps,
58082815dcSEvan Bacon        mod: withGradleProperties,
59082815dcSEvan Bacon        modResults: originalGradleProperties,
60082815dcSEvan Bacon      }
61082815dcSEvan Bacon    );
62082815dcSEvan Bacon    expect(modResults).toContainEqual({
63082815dcSEvan Bacon      type: 'property',
64*0e8f799bSKudo Chien      key: HERMES_PROP_KEY,
65*0e8f799bSKudo Chien      value: 'true',
66082815dcSEvan Bacon    });
67082815dcSEvan Bacon  });
68082815dcSEvan Bacon});
69082815dcSEvan Bacon
70082815dcSEvan Bacondescribe(updateAndroidBuildPropertiesFromConfig, () => {
71082815dcSEvan Bacon  it('should respect `propValueGetter` order', () => {
72082815dcSEvan Bacon    const gradleProperties = [];
73082815dcSEvan Bacon    const configToPropertyRules = [
74082815dcSEvan Bacon      {
75*0e8f799bSKudo Chien        propName: HERMES_PROP_KEY,
76*0e8f799bSKudo Chien        propValueGetter: (config) =>
77*0e8f799bSKudo Chien          ((config.android?.jsEngine ?? config.jsEngine ?? 'hermes') === 'hermes').toString(),
78082815dcSEvan Bacon      },
79082815dcSEvan Bacon    ];
80082815dcSEvan Bacon
81082815dcSEvan Bacon    expect(
82082815dcSEvan Bacon      updateAndroidBuildPropertiesFromConfig(
83082815dcSEvan Bacon        { jsEngine: 'hermes', android: { jsEngine: 'jsc' } },
84082815dcSEvan Bacon        gradleProperties,
85082815dcSEvan Bacon        configToPropertyRules
86082815dcSEvan Bacon      )
87082815dcSEvan Bacon    ).toContainEqual({
88082815dcSEvan Bacon      type: 'property',
89*0e8f799bSKudo Chien      key: HERMES_PROP_KEY,
90*0e8f799bSKudo Chien      value: 'false',
91082815dcSEvan Bacon    });
92082815dcSEvan Bacon
93082815dcSEvan Bacon    expect(
94082815dcSEvan Bacon      updateAndroidBuildPropertiesFromConfig(
95082815dcSEvan Bacon        { jsEngine: 'jsc' },
96082815dcSEvan Bacon        gradleProperties,
97082815dcSEvan Bacon        configToPropertyRules
98082815dcSEvan Bacon      )
99082815dcSEvan Bacon    ).toContainEqual({
100082815dcSEvan Bacon      type: 'property',
101*0e8f799bSKudo Chien      key: HERMES_PROP_KEY,
102*0e8f799bSKudo Chien      value: 'false',
103082815dcSEvan Bacon    });
104082815dcSEvan Bacon
105082815dcSEvan Bacon    expect(
106082815dcSEvan Bacon      updateAndroidBuildPropertiesFromConfig({}, gradleProperties, configToPropertyRules)
107082815dcSEvan Bacon    ).toContainEqual({
108082815dcSEvan Bacon      type: 'property',
109*0e8f799bSKudo Chien      key: HERMES_PROP_KEY,
110*0e8f799bSKudo Chien      value: 'true',
111082815dcSEvan Bacon    });
112082815dcSEvan Bacon  });
113082815dcSEvan Bacon});
114082815dcSEvan Bacon
115082815dcSEvan Bacondescribe(updateAndroidBuildProperty, () => {
116082815dcSEvan Bacon  it('should merge properties', () => {
117082815dcSEvan Bacon    const gradleProperties: PropertiesItem[] = [
118082815dcSEvan Bacon      { type: 'property', key: 'foo', value: 'foo' },
119082815dcSEvan Bacon      { type: 'property', key: 'bar', value: 'bar' },
120082815dcSEvan Bacon      { type: 'property', key: 'name', value: 'oldName' },
121082815dcSEvan Bacon    ];
122082815dcSEvan Bacon    expect(updateAndroidBuildProperty(gradleProperties, 'name', 'newName')).toEqual([
123082815dcSEvan Bacon      { type: 'property', key: 'foo', value: 'foo' },
124082815dcSEvan Bacon      { type: 'property', key: 'bar', value: 'bar' },
125082815dcSEvan Bacon      { type: 'property', key: 'name', value: 'newName' },
126082815dcSEvan Bacon    ]);
127082815dcSEvan Bacon  });
128082815dcSEvan Bacon
129082815dcSEvan Bacon  it('should keep original property when `value` is null by default', () => {
130082815dcSEvan Bacon    const gradleProperties: PropertiesItem[] = [
131082815dcSEvan Bacon      { type: 'property', key: 'foo', value: 'foo' },
132082815dcSEvan Bacon      { type: 'property', key: 'bar', value: 'bar' },
133082815dcSEvan Bacon    ];
134082815dcSEvan Bacon    expect(updateAndroidBuildProperty(gradleProperties, 'bar', null)).toEqual([
135082815dcSEvan Bacon      { type: 'property', key: 'foo', value: 'foo' },
136082815dcSEvan Bacon      { type: 'property', key: 'bar', value: 'bar' },
137082815dcSEvan Bacon    ]);
138082815dcSEvan Bacon  });
139082815dcSEvan Bacon
140082815dcSEvan Bacon  it('should remove original property when `value` is null when `removePropWhenValueIsNull` is true', () => {
141082815dcSEvan Bacon    const gradleProperties: PropertiesItem[] = [
142082815dcSEvan Bacon      { type: 'property', key: 'foo', value: 'foo' },
143082815dcSEvan Bacon      { type: 'property', key: 'bar', value: 'bar' },
144082815dcSEvan Bacon    ];
145082815dcSEvan Bacon    expect(
146082815dcSEvan Bacon      updateAndroidBuildProperty(gradleProperties, 'bar', null, {
147082815dcSEvan Bacon        removePropWhenValueIsNull: true,
148082815dcSEvan Bacon      })
149082815dcSEvan Bacon    ).toEqual([{ type: 'property', key: 'foo', value: 'foo' }]);
150082815dcSEvan Bacon  });
151082815dcSEvan Bacon});
152