diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 0000000..9c4ef7a --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,63 @@ +name: CI Test + +on: [pull_request] + +jobs: + + android-x86_64: + runs-on: macos-13 + + steps: + - uses: actions/checkout@v1 + - name: Select XCode 14.2 + run: sudo xcode-select --switch /Applications/Xcode_14.2.app + - name: Install NDK + run: $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "ndk;25.2.9519653" + - name: Install Swift Android Toolchain + run: wget https://github.com/readdle/swift-android-toolchain/releases/latest/download/swift-android.zip; + unzip swift-android.zip; + swift-android/bin/swift-android tools --update; + - name: Install Android Emulator + run: $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "system-images;android-29;google_apis;x86_64" + - name: Create Android Emulator + run: $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n ci-test -k "system-images;android-29;google_apis;x86_64" -d "pixel" --force + - name: Start Android Emulator + run: $ANDROID_HOME/emulator/emulator -no-window -avd ci-test -noaudio > /dev/null & + - name: Run connected android tests + run: export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/25.2.9519653; + export SWIFT_ANDROID_HOME=$(pwd)/swift-android; + export PATH=$ANDROID_NDK_HOME:$PATH; + export PATH=$SWIFT_ANDROID_HOME/bin:$SWIFT_ANDROID_HOME/build-tools/current:$PATH; + adb wait-for-device; + ./gradlew sample:cAT + + # It looks like macos-13-arm64 is quite busy on Gtihub CI, skip for now + + # android-arm64-v8a: + # runs-on: macos-13-arm64 + + # steps: + # - uses: actions/checkout@v1 + # - name: Select XCode 14.2 + # run: sudo xcode-select --switch /Applications/Xcode_14.2.app + # - name: Install NDK + # run: $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "ndk;25.2.9519653" + # - name: Install Swift Android Toolchain + # run: wget https://github.com/readdle/swift-android-toolchain/releases/latest/download/swift-android.zip; + # unzip swift-android.zip; + # swift-android/bin/swift-android tools --update; + # - name: Accept Android SDK licenses + # run: yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses + # - name: Install Android Emulator + # run: $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "system-images;android-29;google_apis;arm64-v8a" + # - name: Create Android Emulator + # run: $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n ci-test -k "system-images;android-29;google_apis;arm64-v8a" -d "pixel" --force + # - name: Start Android Emulator + # run: $ANDROID_HOME/emulator/emulator -no-window -avd ci-test -noaudio > /dev/null & + # - name: Run connected android tests + # run: export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/25.2.9519653; + # export SWIFT_ANDROID_HOME=$(pwd)/swift-android; + # export PATH=$ANDROID_NDK_HOME:$PATH; + # export PATH=$SWIFT_ANDROID_HOME/bin:$SWIFT_ANDROID_HOME/build-tools/current:$PATH; + # adb wait-for-device; + # ./gradlew sample:cAT diff --git a/.github/workflows/android_x86.yml b/.github/workflows/android_x86.yml deleted file mode 100644 index c9458c2..0000000 --- a/.github/workflows/android_x86.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Android CI x86 - -on: [pull_request] - -jobs: - build: - - runs-on: macOS-latest - - steps: - - uses: actions/checkout@v1 - - name: set up JDK 1.8 - uses: actions/setup-java@v1 - with: - java-version: 1.8 - - name: Install Swift toolchain 5.4.2 - run: wget https://swift.org/builds/swift-5.4.2-release/xcode/swift-5.4.2-RELEASE/swift-5.4.2-RELEASE-osx.pkg; - sudo installer -pkg swift-5.4.2-RELEASE-osx.pkg -target / - - name: Install NDK - run: wget https://dl.google.com/android/repository/android-ndk-r21e-darwin-x86_64.zip; - unzip android-ndk-r21e-darwin-x86_64.zip - - name: Install Swift Android Toolchain - run: wget https://github.com/readdle/swift-android-toolchain/releases/latest/download/swift-android-5.4-r1.zip; - unzip swift-android-5.4-r1.zip; - rm -rf swift-android-5.4-r1.zip; - swift-android-5.4-r1/bin/swift-android tools --update; - ln -sfn swift-android-5.4-r1 swift-android-current - - name: Download Android Emulator - run: $ANDROID_HOME/tools/bin/sdkmanager "system-images;android-29;google_apis;x86" - - name: Create Android Emulator - run: $ANDROID_HOME/tools/bin/avdmanager create avd -n ci-test -k "system-images;android-29;google_apis;x86" -d "pixel" --force - - name: Start Android Emulator - run: $ANDROID_HOME/emulator/emulator -no-window -avd ci-test -noaudio > /dev/null & - - name: Run connected android tests - run: export TOOLCHAINS=org.swift.540202104261a; - export ANDROID_NDK_HOME=$(pwd)/android-ndk-r21e; - export SWIFT_ANDROID_HOME=$(pwd)/swift-android-current; - export PATH=$ANDROID_NDK_HOME:$PATH; - export PATH=$SWIFT_ANDROID_HOME/bin:$SWIFT_ANDROID_HOME/build-tools/current:$PATH; - adb wait-for-device; - ./gradlew sample:cAT diff --git a/.github/workflows/android_x86_64.yml b/.github/workflows/android_x86_64.yml deleted file mode 100644 index c8358a8..0000000 --- a/.github/workflows/android_x86_64.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Android CI x86_64 - -on: [pull_request] - -jobs: - build: - - runs-on: macOS-latest - - steps: - - uses: actions/checkout@v1 - - name: set up JDK 1.8 - uses: actions/setup-java@v1 - with: - java-version: 1.8 - - name: Install Swift toolchain 5.4.2 - run: wget https://swift.org/builds/swift-5.4.2-release/xcode/swift-5.4.2-RELEASE/swift-5.4.2-RELEASE-osx.pkg; - sudo installer -pkg swift-5.4.2-RELEASE-osx.pkg -target / - - name: Install NDK - run: wget https://dl.google.com/android/repository/android-ndk-r21e-darwin-x86_64.zip; - unzip android-ndk-r21e-darwin-x86_64.zip - - name: Install Swift Android Toolchain - run: wget https://github.com/readdle/swift-android-toolchain/releases/latest/download/swift-android-5.4-r1.zip; - unzip swift-android-5.4-r1.zip; - rm -rf swift-android-5.4-r1.zip; - swift-android-5.4-r1/bin/swift-android tools --update; - ln -sfn swift-android-5.4-r1 swift-android-current - - name: Download Android Emulator - run: $ANDROID_HOME/tools/bin/sdkmanager "system-images;android-29;google_apis;x86_64" - - name: Create Android Emulator - run: $ANDROID_HOME/tools/bin/avdmanager create avd -n ci-test -k "system-images;android-29;google_apis;x86_64" -d "pixel" --force - - name: Start Android Emulator - run: $ANDROID_HOME/emulator/emulator -no-window -avd ci-test -noaudio > /dev/null & - - name: Run connected android tests - run: export TOOLCHAINS=org.swift.540202104261a; - export ANDROID_NDK_HOME=$(pwd)/android-ndk-r21e; - export SWIFT_ANDROID_HOME=$(pwd)/swift-android-current; - export PATH=$ANDROID_NDK_HOME:$PATH; - export PATH=$SWIFT_ANDROID_HOME/bin:$SWIFT_ANDROID_HOME/build-tools/current:$PATH; - adb wait-for-device; - ./gradlew sample:cAT diff --git a/build.gradle b/build.gradle index 8b57c27..51370d9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.6.21' + ext.kotlin_version = '2.0.21' repositories { google() @@ -10,8 +10,8 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.4.2' - classpath "com.readdle.android.swift:gradle:1.4.4" + classpath 'com.android.tools.build:gradle:8.3.2' + classpath "com.readdle.android.swift:gradle:6.0.3" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" classpath 'io.github.gradle-nexus:publish-plugin:1.1.0' @@ -34,5 +34,5 @@ apply from: "${rootDir}/publish-root.gradle" ext { PUBLISH_GROUP_ID = 'com.readdle.swift.java.codegen' - PUBLISH_VERSION = "0.9.4" + PUBLISH_VERSION = "0.9.6" } \ No newline at end of file diff --git a/compiler/src/main/java/com/readdle/codegen/JavaSwiftProcessor.java b/compiler/src/main/java/com/readdle/codegen/JavaSwiftProcessor.java index d325869..5ff4553 100644 --- a/compiler/src/main/java/com/readdle/codegen/JavaSwiftProcessor.java +++ b/compiler/src/main/java/com/readdle/codegen/JavaSwiftProcessor.java @@ -64,7 +64,6 @@ public synchronized void init(ProcessingEnvironment processingEnv) { moduleDescriptor = new Gson().fromJson(packageJson, SwiftModuleDescriptor.class); if (moduleDescriptor == null) { - error(null, "No package description with option: com.readdle.codegen.package"); return; } diff --git a/compiler/src/main/java/com/readdle/codegen/SwiftValueDescriptor.java b/compiler/src/main/java/com/readdle/codegen/SwiftValueDescriptor.java index d9c5825..5019177 100644 --- a/compiler/src/main/java/com/readdle/codegen/SwiftValueDescriptor.java +++ b/compiler/src/main/java/com/readdle/codegen/SwiftValueDescriptor.java @@ -67,13 +67,6 @@ class SwiftValueDescriptor { enclosingElement = enclosingElement.getEnclosingElement(); } - - // Check if it's an abstract class - if (classElement.getModifiers().contains(Modifier.ABSTRACT)) { - throw new IllegalArgumentException(String.format("The class %s is abstract. You can't annotate abstract classes with @%s", - classElement.getQualifiedName().toString(), SwiftValue.class.getSimpleName())); - } - boolean hasEmptyConstructor = false; // Check if an empty constructor is given diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180..a4b76b9 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8049c68..9355b41 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c787..f5feea6 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +82,12 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +134,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,11 +201,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ @@ -205,6 +217,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index ac1b06f..9b42019 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,8 +13,10 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +27,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,13 +43,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -56,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -75,13 +78,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/sample/build.gradle b/sample/build.gradle index cc5393d..f68b3ba 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -13,11 +13,12 @@ swift { } android { - compileSdkVersion 31 + namespace = "com.readdle.swiftjava.sample" + compileSdkVersion 34 defaultConfig { applicationId "com.readdle.swiftjava.sample" - minSdkVersion 21 - targetSdkVersion 31 + minSdkVersion 24 + targetSdkVersion 34 versionCode 1 versionName "1.0" testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' @@ -35,6 +36,16 @@ android { } } } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = "11" + } + buildTypes { release { debuggable false @@ -55,10 +66,10 @@ dependencies { kapt project(':compiler') implementation project(':library') - implementation "androidx.appcompat:appcompat:1.3.1" - implementation 'androidx.constraintlayout:constraintlayout:2.1.0' + implementation "androidx.appcompat:appcompat:1.7.0" + implementation 'androidx.constraintlayout:constraintlayout:2.2.1' testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test:rules:1.4.0' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + androidTestImplementation 'androidx.test.ext:junit:1.2.1' + androidTestImplementation 'androidx.test:rules:1.6.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' } diff --git a/sample/src/androidTest/java/com/readdle/swiftjava/sample/SampleEnumWithValueTests.kt b/sample/src/androidTest/java/com/readdle/swiftjava/sample/SampleEnumWithValueTests.kt new file mode 100644 index 0000000..8b5090b --- /dev/null +++ b/sample/src/androidTest/java/com/readdle/swiftjava/sample/SampleEnumWithValueTests.kt @@ -0,0 +1,182 @@ +package com.readdle.swiftjava.sample + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.readdle.codegen.anotation.JavaSwift +import org.junit.Assert +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class SampleEnumWithValueTests { + + @Before + fun setUp() { + System.loadLibrary("SampleAppCore") + JavaSwift.init() + } + + @Test + fun testNone() { + val value = SampleEnumWithValue.copy(SampleEnumWithValue.None) + Assert.assertTrue(value == SampleEnumWithValue.None) + } + + @Test + fun testStringValue() { + val value = SampleEnumWithValue.copy(SampleEnumWithValue.StringValue("42")) + Assert.assertEquals((value as SampleEnumWithValue.StringValue).value, "42") + } + + @Test + fun testIntegerValue() { + val value = SampleEnumWithValue.copy(SampleEnumWithValue.IntegerValue(42)) + Assert.assertEquals((value as SampleEnumWithValue.IntegerValue).value, 42) + } + + @Test + fun testInt8Value() { + val value = SampleEnumWithValue.copy(SampleEnumWithValue.Int8Value(42)) + Assert.assertEquals((value as SampleEnumWithValue.Int8Value).value.toInt(), 42) + } + + @Test + fun testInt16Value() { + val value = SampleEnumWithValue.copy(SampleEnumWithValue.Int16Value(42)) + Assert.assertEquals((value as SampleEnumWithValue.Int16Value).value.toInt(), 42) + } + + @Test + fun testInt32Value() { + val value = SampleEnumWithValue.copy(SampleEnumWithValue.Int32Value(42)) + Assert.assertEquals((value as SampleEnumWithValue.Int32Value).value, 42) + } + + @Test + fun testInt64Value() { + val value = SampleEnumWithValue.copy(SampleEnumWithValue.Int64Value(42)) + Assert.assertEquals((value as SampleEnumWithValue.Int64Value).value, 42) + } + + @Test + fun testUIntValue() { + val value = SampleEnumWithValue.copy(SampleEnumWithValue.UintValue(42U)) + Assert.assertEquals((value as SampleEnumWithValue.UintValue).value, 42U) + } + + @Test + fun testUInt8Value() { + val value = SampleEnumWithValue.copy(SampleEnumWithValue.Uint8Value(42U)) + Assert.assertEquals((value as SampleEnumWithValue.Uint8Value).value.toUInt(), 42U) + } + + @Test + fun testUInt16Value() { + val value = SampleEnumWithValue.copy(SampleEnumWithValue.Uint16Value(42U)) + Assert.assertEquals((value as SampleEnumWithValue.Uint16Value).value.toUInt(), 42U) + } + + @Test + fun testUInt32Value() { + val value = SampleEnumWithValue.copy(SampleEnumWithValue.Uint32Value(42U)) + Assert.assertEquals((value as SampleEnumWithValue.Uint32Value).value, 42U) + } + + @Test + fun testUInt64Value() { + val value = SampleEnumWithValue.copy(SampleEnumWithValue.Uint64Value(42U)) + Assert.assertEquals((value as SampleEnumWithValue.Uint64Value).value.toUInt(), 42U) + } + + @Test + fun testObjectArrayValue() { + val array = arrayListOf(SampleValue.getRandomValue()) + val value = SampleEnumWithValue.copy(SampleEnumWithValue.ObjectArrayValue(array)) + Assert.assertEquals((value as SampleEnumWithValue.ObjectArrayValue).value, array) + } + + @Test + fun testStringArrayValue() { + val array = arrayListOf("42") + val value = SampleEnumWithValue.copy(SampleEnumWithValue.StringArrayValue(array)) + Assert.assertEquals((value as SampleEnumWithValue.StringArrayValue).value, array) + } + + @Test + fun testNumberArrayValue() { + val array = arrayListOf(42) + val value = SampleEnumWithValue.copy(SampleEnumWithValue.NumberArrayValue(array)) + Assert.assertEquals((value as SampleEnumWithValue.NumberArrayValue).value, array) + } + + @Test + fun testArrayInArrayValue() { + val array = arrayListOf(arrayListOf(42)) + val value = SampleEnumWithValue.copy(SampleEnumWithValue.ArrayInArrayValue(array)) + Assert.assertEquals((value as SampleEnumWithValue.ArrayInArrayValue).value, array) + } + + @Test + fun testDictInArrayValue() { + val array = arrayListOf(hashMapOf(42 to 42)) + val value = SampleEnumWithValue.copy(SampleEnumWithValue.DictInArrayValue(array)) + Assert.assertEquals((value as SampleEnumWithValue.DictInArrayValue).value, array) + } + + @Test + fun testDictSampleClassValue() { + val dict = hashMapOf("abc" to SampleValue.getRandomValue()) + val value = SampleEnumWithValue.copy(SampleEnumWithValue.DictSampleClassValue(dict)) + Assert.assertEquals((value as SampleEnumWithValue.DictSampleClassValue).value, dict) + } + + @Test + fun testDictStringsValue() { + val dict = hashMapOf("abc" to "42") + val value = SampleEnumWithValue.copy(SampleEnumWithValue.DictStringsValue(dict)) + Assert.assertEquals((value as SampleEnumWithValue.DictStringsValue).value, dict) + } + + @Test + fun testDictNumbersValue() { + val dict = hashMapOf(42 to 42) + val value = SampleEnumWithValue.copy(SampleEnumWithValue.DictNumbersValue(dict)) + Assert.assertEquals((value as SampleEnumWithValue.DictNumbersValue).value, dict) + } + + @Test + fun testDict64NumbersValue() { + val dict = hashMapOf(10 to 10) + val value = SampleEnumWithValue.copy(SampleEnumWithValue.Dict64NumbersValue(dict)) + Assert.assertEquals((value as SampleEnumWithValue.Dict64NumbersValue).value, dict) + } + + @Test + fun testDictInDictValue() { + val dict = hashMapOf(10 to hashMapOf(10 to 10)) + val value = SampleEnumWithValue.copy(SampleEnumWithValue.DictInDictValue(dict)) + Assert.assertEquals((value as SampleEnumWithValue.DictInDictValue).value, dict) + } + + @Test + fun testArrayInDictValue() { + val dict = hashMapOf(10 to arrayListOf(10, 10)) + val value = SampleEnumWithValue.copy(SampleEnumWithValue.ArrayInDictValue(dict)) + Assert.assertEquals((value as SampleEnumWithValue.ArrayInDictValue).value, dict) + } + + @Test + fun testSetValue() { + val set = hashSetOf(42) + val value = SampleEnumWithValue.copy(SampleEnumWithValue.SetValue(set)) + Assert.assertEquals((value as SampleEnumWithValue.SetValue).value, set) + } + + @Test + fun testSetValuesValue() { + val set = hashSetOf(SampleValue.getRandomValue()) + val value = SampleEnumWithValue.copy(SampleEnumWithValue.SetValuesValue(set)) + Assert.assertEquals((value as SampleEnumWithValue.SetValuesValue).value, set) + } + +} \ No newline at end of file diff --git a/sample/src/main/java/com/readdle/swiftjava/sample/SampleEnumWithValue.kt b/sample/src/main/java/com/readdle/swiftjava/sample/SampleEnumWithValue.kt new file mode 100644 index 0000000..137dfb8 --- /dev/null +++ b/sample/src/main/java/com/readdle/swiftjava/sample/SampleEnumWithValue.kt @@ -0,0 +1,41 @@ +package com.readdle.swiftjava.sample + +import com.readdle.codegen.anotation.SwiftFunc +import com.readdle.codegen.anotation.SwiftValue + +@SwiftValue +sealed class SampleEnumWithValue { + + object None : SampleEnumWithValue() + data class StringValue(val value: String) : SampleEnumWithValue() + data class IntegerValue(val value: Int) : SampleEnumWithValue() + data class Int8Value(val value: Byte) : SampleEnumWithValue() + data class Int16Value(val value: Short) : SampleEnumWithValue() + data class Int32Value(val value: Int) : SampleEnumWithValue() + data class Int64Value(val value: Long) : SampleEnumWithValue() + data class UintValue(val value: UInt) : SampleEnumWithValue() + data class Uint8Value(val value: UByte) : SampleEnumWithValue() + data class Uint16Value(val value: UShort) : SampleEnumWithValue() + data class Uint32Value(val value: UInt) : SampleEnumWithValue() + data class Uint64Value(val value: ULong) : SampleEnumWithValue() + data class ObjectArrayValue(val value: ArrayList) : SampleEnumWithValue() + data class StringArrayValue(val value: ArrayList) : SampleEnumWithValue() + data class NumberArrayValue(val value: ArrayList) : SampleEnumWithValue() + data class ArrayInArrayValue(val value: ArrayList>) : SampleEnumWithValue() + data class DictInArrayValue(val value: ArrayList>) : SampleEnumWithValue() + data class DictSampleClassValue(val value: HashMap) : SampleEnumWithValue() + data class DictStringsValue(val value: HashMap) : SampleEnumWithValue() + data class DictNumbersValue(val value: HashMap) : SampleEnumWithValue() + data class Dict64NumbersValue(val value: HashMap) : SampleEnumWithValue() + data class DictInDictValue(val value: HashMap>) : SampleEnumWithValue() + data class ArrayInDictValue(val value: HashMap>) : SampleEnumWithValue() + data class SetValue(val value: HashSet) : SampleEnumWithValue() + data class SetValuesValue(val value: HashSet) : SampleEnumWithValue() + + companion object { + + @JvmStatic + @SwiftFunc("copy(value:)") + external fun copy(value: SampleEnumWithValue): SampleEnumWithValue + } +} \ No newline at end of file diff --git a/sample/src/main/swift/Package.resolved b/sample/src/main/swift/Package.resolved index baa9f3b..4fad2f7 100644 --- a/sample/src/main/swift/Package.resolved +++ b/sample/src/main/swift/Package.resolved @@ -6,8 +6,8 @@ "repositoryURL": "https://github.com/readdle/java_swift.git", "state": { "branch": null, - "revision": "c1ed735ca2e82d961511ee6e938157f78c31278b", - "version": "2.2.0" + "revision": "8c6910dbc94657e5dfb2bc9d1d4d862ffd809d83", + "version": "2.2.3" } }, { @@ -15,8 +15,8 @@ "repositoryURL": "https://github.com/readdle/swift-android-ndk.git", "state": { "branch": null, - "revision": "9c19fb50851c9e05df875ef7db45c3d59b39aaa3", - "version": "1.1.3" + "revision": "0fbe0b28344b75079ff5d811551727bdd4ab8ec0", + "version": "1.1.4" } }, { @@ -42,8 +42,8 @@ "repositoryURL": "https://github.com/readdle/swift-java-coder.git", "state": { "branch": null, - "revision": "c2980b1eab70202b09d31db7cdce317b1c05c2b2", - "version": "1.1.0" + "revision": "d46cfd9f0efb61e45b08a01160a9e4aa35ae4817", + "version": "1.1.2" } } ] diff --git a/sample/src/main/swift/Package.swift b/sample/src/main/swift/Package.swift index 55a47e8..2fb8585 100755 --- a/sample/src/main/swift/Package.swift +++ b/sample/src/main/swift/Package.swift @@ -13,9 +13,9 @@ let package = Package( .library(name: packageName, type: .dynamic, targets: [generatedName]) ], dependencies: [ - .package(url: "https://github.com/readdle/java_swift.git", .upToNextMinor(from: "2.2.0")), + .package(url: "https://github.com/readdle/java_swift.git", .upToNextMinor(from: "2.2.3")), .package(url: "https://github.com/readdle/swift-java.git", .upToNextMinor(from: "0.3.0")), - .package(url: "https://github.com/readdle/swift-java-coder.git", .upToNextMinor(from: "1.1.0")), + .package(url: "https://github.com/readdle/swift-java-coder.git", .upToNextMinor(from: "1.1.2")), .package(url: "https://github.com/readdle/swift-anycodable.git", .upToNextMinor(from: "1.0.3")), ], targets: [ diff --git a/sample/src/main/swift/Sources/SampleAppCore/SampleEnumWithValue.swift b/sample/src/main/swift/Sources/SampleAppCore/SampleEnumWithValue.swift new file mode 100644 index 0000000..a0a6a2f --- /dev/null +++ b/sample/src/main/swift/Sources/SampleAppCore/SampleEnumWithValue.swift @@ -0,0 +1,47 @@ +// +// Created by Andrew Druk on 06.05.2024. +// + +import Foundation + +public enum SampleEnumWithValue: Codable { + case none + case stringValue(value: String) + case integerValue(value: Int) + case int8Value(value: Int8) + case int16Value(value: Int16) + case int32Value(value: Int32) + case int64Value(value: Int64) + case uintValue(value: UInt) + case uint8Value(value: UInt8) + case uint16Value(value: UInt16) + case uint32Value(value: UInt32) + case uint64Value(value: UInt64) + case optionalIntegerValue(value: Int?) + case optionalInt8Value(value: Int8?) + case optionalInt16Value(value: Int16?) + case optionalInt32Value(value: Int32?) + case optionalInt64Value(value: Int64?) + case optionalUintValue(value: UInt?) + case optionalUint8Value(value: UInt8?) + case optionalUint16Value(value: UInt16?) + case optionalUint32Value(value: UInt32?) + case optionalUint64Value(value: UInt64?) + case objectArrayValue(value: [SampleValue]) + case stringArrayValue(value: [String]) + case numberArrayValue(value: [Int]) + case arrayInArrayValue(value: [[Int]]) + case dictInArrayValue(value: [[Int: Int]]) + case dictSampleClassValue(value: [String: SampleValue]) + case dictStringsValue(value: [String: String]) + case dictNumbersValue(value: [Int: Int]) + case dict64NumbersValue(value: [Int: Int]) + case dictInDictValue(value: [Int: [Int: Int]]) + case arrayInDictValue(value: [Int: [Int]]) + case setValue(value: Set) + case setValuesValue(value: Set) + + public static func copy(value: SampleEnumWithValue) -> SampleEnumWithValue { + return value + } +} \ No newline at end of file