From 9e61712f9ab1ae09c12c3f99b4ae44a5c45e0ede Mon Sep 17 00:00:00 2001 From: Dratwas Date: Wed, 24 Jul 2019 13:32:58 +0200 Subject: [PATCH 1/2] Android - find package's class name regex tweaks + tests --- .../src/config/__fixtures__/android.js | 142 ++++++++++++++++++ .../__tests__/findPackageClassName-test.js | 28 +++- .../src/config/findPackageClassName.js | 17 ++- 3 files changed, 181 insertions(+), 6 deletions(-) diff --git a/packages/platform-android/src/config/__fixtures__/android.js b/packages/platform-android/src/config/__fixtures__/android.js index d5f603069..2d27da0d6 100644 --- a/packages/platform-android/src/config/__fixtures__/android.js +++ b/packages/platform-android/src/config/__fixtures__/android.js @@ -91,3 +91,145 @@ exports.noPackage = { }, }, }; + +exports.findPackagesClassNameKotlinValid = [ + ` + class SomeExampleKotlinPackage() : ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, + ` + class SomeExampleKotlinPackage : ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, + ` + class SomeExampleKotlinPackage:ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, + ` + class SomeExampleKotlinPackage + : + ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, + ` + class SomeExampleKotlinPackage() : SomeDelegate, OtherDelegate, ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, + ` + class SomeExampleKotlinPackage(val name: String) : SomeDelegate, OtherDelegate, ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, + ` + class SomeExampleKotlinPackage : SomeSuper(), ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, +]; + +exports.findPackagesClassNameKotlinNotValid = [ + ` + class SomeExampleKotlinPackage() { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, + ` + class SomeExampleKotlinPackage { + val package: ReactPackage = ReactPackage() + }`, + ` + class ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): MutableList { + return Collections.emptyList() + } + override fun createViewManagers(reactContext: ReactApplicationContext): MutableList> { + return Collections.emptyList() + } + }`, +]; + +exports.findPackagesClassNameJavaValid = [ + ` + class SomeExampleKotlinPackage implements ReactPackage { + + } + `, + ` + class SomeExampleKotlinPackage implements SomePackage, ReactPackage { + + } + `, + ` + class SomeExampleKotlinPackage extends SomeSuper implements SomePackage, ReactPackage { + + } + `, + ` + class SomeExampleKotlinPackage + implements + SomePackage, + ReactPackage { + + } + `, +]; + +exports.findPackagesClassNameJavaNotValid = [ + ` + class SomeExampleKotlinPackage implements SomePackage { + + } + `, + ` + class ReactPackage { + + } + `, + ` + class SomeExampleKotlinPackage extends ReactPackage { + + } + `, + ` + class SomeExampleKotlinPackage { + + } + `, +]; diff --git a/packages/platform-android/src/config/__tests__/findPackageClassName-test.js b/packages/platform-android/src/config/__tests__/findPackageClassName-test.js index f12b6c555..4574870d5 100644 --- a/packages/platform-android/src/config/__tests__/findPackageClassName-test.js +++ b/packages/platform-android/src/config/__tests__/findPackageClassName-test.js @@ -9,7 +9,7 @@ */ import mocks from '../__fixtures__/android'; -import findPackageClassName from '../findPackageClassName'; +import findPackageClassName, {matchClassName} from '../findPackageClassName'; jest.mock('path'); jest.mock('fs'); @@ -55,3 +55,29 @@ const fs = require('fs'); }); }); }); + +describe('android:FindPackageClassNameRegex', () => { + it('returns the name of the kotlin class implementing ReactPackage', () => { + mocks.findPackagesClassNameKotlinValid.forEach(file => { + expect(matchClassName(file)[1]).toBe('SomeExampleKotlinPackage'); + }); + }); + + it('returns `null` if there are no matches for kotlin classes', () => { + mocks.findPackagesClassNameKotlinNotValid.forEach(file => { + expect(matchClassName(file)).toBeNull(); + }); + }); + + it('returns the name of the java class implementing ReactPackage', () => { + mocks.findPackagesClassNameJavaValid.forEach(file => { + expect(matchClassName(file)[1]).toBe('SomeExampleKotlinPackage'); + }); + }); + + it('returns `null` if there are no matches for java classes', () => { + mocks.findPackagesClassNameJavaNotValid.forEach(file => { + expect(matchClassName(file)).toBeNull(); + }); + }); +}); diff --git a/packages/platform-android/src/config/findPackageClassName.js b/packages/platform-android/src/config/findPackageClassName.js index 6a22310f7..16866ab87 100644 --- a/packages/platform-android/src/config/findPackageClassName.js +++ b/packages/platform-android/src/config/findPackageClassName.js @@ -22,12 +22,19 @@ export default function getPackageClassName(folder) { const packages = files .map(filePath => fs.readFileSync(path.join(folder, filePath), 'utf8')) - .map(file => - file.match( - /class\s+(.+[^\s])(\s+implements\s+|\s*:)[\s,\w]*[^{]*ReactPackage/, - ), - ) + .map(matchClassName) .filter(match => match); return packages.length ? packages[0][1] : null; } + +/** + * Match function that is looking for package's class name in file + * + * @param {String} file Content of file to match + */ +export function matchClassName(file) { + return file.match( + /class\s+(\w+[^(\s]*)[\s\w():]*(\s+implements\s+|:)[\s\w():,]*[^{]*ReactPackage/, + ); +} From eabd2caf2a165e1aea24ef835a12f551312fa9b6 Mon Sep 17 00:00:00 2001 From: Dratwas Date: Wed, 24 Jul 2019 13:46:08 +0200 Subject: [PATCH 2/2] test tweaks --- .../__tests__/findPackageClassName-test.js | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/packages/platform-android/src/config/__tests__/findPackageClassName-test.js b/packages/platform-android/src/config/__tests__/findPackageClassName-test.js index 4574870d5..2f70ea374 100644 --- a/packages/platform-android/src/config/__tests__/findPackageClassName-test.js +++ b/packages/platform-android/src/config/__tests__/findPackageClassName-test.js @@ -57,27 +57,25 @@ const fs = require('fs'); }); describe('android:FindPackageClassNameRegex', () => { - it('returns the name of the kotlin class implementing ReactPackage', () => { - mocks.findPackagesClassNameKotlinValid.forEach(file => { - expect(matchClassName(file)[1]).toBe('SomeExampleKotlinPackage'); + [ + mocks.findPackagesClassNameKotlinValid, + mocks.findPackagesClassNameJavaValid, + ].forEach(files => { + it('returns the name of the kotlin/java class implementing ReactPackage', () => { + files.forEach(file => { + expect(matchClassName(file)[1]).toBe('SomeExampleKotlinPackage'); + }); }); }); - it('returns `null` if there are no matches for kotlin classes', () => { - mocks.findPackagesClassNameKotlinNotValid.forEach(file => { - expect(matchClassName(file)).toBeNull(); - }); - }); - - it('returns the name of the java class implementing ReactPackage', () => { - mocks.findPackagesClassNameJavaValid.forEach(file => { - expect(matchClassName(file)[1]).toBe('SomeExampleKotlinPackage'); - }); - }); - - it('returns `null` if there are no matches for java classes', () => { - mocks.findPackagesClassNameJavaNotValid.forEach(file => { - expect(matchClassName(file)).toBeNull(); + [ + mocks.findPackagesClassNameKotlinNotValid, + mocks.findPackagesClassNameJavaNotValid, + ].forEach(files => { + it('returns `null` if there are no matches for kotlin/java classes', () => { + files.forEach(file => { + expect(matchClassName(file)).toBeNull(); + }); }); }); });