From 4efe9a0ae004dff01ac53e401a80a09a2e30a686 Mon Sep 17 00:00:00 2001 From: Felix MIL <34234913+Felixmil@users.noreply.github.com> Date: Tue, 17 Dec 2024 02:02:31 +0100 Subject: [PATCH] macOS support for rSharp (#160) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Robert McIntosh <261477+rwmcintosh@users.noreply.github.com> Co-authored-by: FĂ©lix MIL Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- .github/workflows/R-CMD-check.yaml | 22 +- .github/workflows/build-c#.yaml | 65 +++-- .../{pr-workflow.yaml => main-workflow.yaml} | 34 ++- .github/workflows/merge-workflow.yaml | 18 -- NEWS.md | 5 + R/rSharp-env.R | 106 +++---- R/zzz.R | 81 +++--- inst/extdata/rSharp.Examples.dll | Bin 5120 -> 5120 bytes inst/lib/ClrFacade.dll | Bin 86528 -> 86528 bytes inst/lib/DynamicInterop.dll | Bin 18944 -> 18944 bytes inst/lib/RDotNet.dll | Bin 131072 -> 131072 bytes inst/lib/RSharp.runtimeconfig.json | 24 +- inst/lib/rSharp.dll | Bin 542720 -> 542720 bytes inst/lib/{rSharp.so => rSharp.linux.so} | Bin 597072 -> 597024 bytes inst/lib/rSharp.mac.so | Bin 0 -> 145744 bytes rSharp.Rproj | 46 +-- .../ClrFacade/InternalRDotNetDataConverter.cs | 10 +- shared/DynamicInterop.TestApp/Program.cs | 2 +- .../WrapDynamicLibrary.cs | 16 +- shared/DynamicInterop/PlatformUtility.cs | 13 +- .../DynamicInterop/SafeHandleUnmanagedDll.cs | 2 +- shared/DynamicInterop/UnixLibraryLoader.cs | 8 +- shared/DynamicInterop/UnmanagedDll.cs | 23 +- shared/R.NET/NativeLibrary/NativeUtility.cs | 17 +- shared/R.NET/REngine.cs | 2 +- shared/RDotNet.TestBase/RDotNetTestFixture.cs | 2 +- shared/makefile | 39 ++- shared/packages.config | 1 + shared/rSharp.cpp | 18 +- tests/testthat/test-basic.R | 264 +++++++++--------- 30 files changed, 449 insertions(+), 369 deletions(-) rename .github/workflows/{pr-workflow.yaml => main-workflow.yaml} (50%) delete mode 100644 .github/workflows/merge-workflow.yaml rename inst/lib/{rSharp.so => rSharp.linux.so} (94%) create mode 100755 inst/lib/rSharp.mac.so diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index eb0b3103..0bda0444 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -14,11 +14,9 @@ jobs: fail-fast: false matrix: config: - # - {os: macos-latest, r: 'release'} + - {os: macos-latest, r: 'release'} - {os: windows-latest, r: 'release'} - - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} - {os: ubuntu-latest, r: 'release'} - # - {os: ubuntu-latest, r: 'oldrel-1'} env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} @@ -26,24 +24,22 @@ jobs: steps: - uses: actions/checkout@v4 + with: + ref: ${{ github.ref }} - uses: r-lib/actions/setup-pandoc@v2 + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 8.0.x + - uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} http-user-agent: ${{ matrix.config.http-user-agent }} use-public-rspm: true - - name: install ubuntu dependencies - if: runner.os == 'Linux' - run: | - sudo apt-get update - sudo apt-get install dotnet-runtime-8.0 libcurl4-openssl-dev libssl-dev libxml2-dev - sudo apt-get install libfontconfig1-dev libharfbuzz-dev libfribidi-dev - sudo apt-get install libfreetype6-dev libpng-dev libtiff5-dev libjpeg-dev - sudo ln -s /usr/lib/x86_64-linux-gnu/libdl.so.2 /usr/lib/x86_64-linux-gnu/libdl.so - - uses: r-lib/actions/setup-r-dependencies@v2 with: extra-packages: any::rcmdcheck @@ -67,7 +63,7 @@ jobs: - name: Get package version from DESCRIPTION file and set as environment variable run: | - echo "PKG_VERSION=$(grep -oP '(?<=Version: )\d+\.\d+\.\d+\.*\d*' DESCRIPTION)" >> $GITHUB_ENV + echo "PKG_VERSION=$(grep '^Version: ' DESCRIPTION | sed -E 's/^Version: ([0-9]+\.[0-9]+\.[0-9]+\.?[0-9]*)/\1/')" >> $GITHUB_ENV echo "$PKG_VERSION" shell: bash diff --git a/.github/workflows/build-c#.yaml b/.github/workflows/build-c#.yaml index 53cf8c28..40bc5eaa 100644 --- a/.github/workflows/build-c#.yaml +++ b/.github/workflows/build-c#.yaml @@ -6,39 +6,76 @@ on: jobs: Linux-Build: - - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} permissions: contents: write steps: - uses: actions/checkout@v4 - if: ${{ github.event_name == 'pull_request' }} with: repository: ${{ github.event.pull_request.head.repo.full_name }} ref: ${{ github.event.pull_request.head.ref }} - - uses: actions/checkout@v4 - if: ${{ github.event_name != 'pull_request' }} - - name: Setup .NET uses: actions/setup-dotnet@v1 with: dotnet-version: 8.0.x + - name: Setup R + uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true + - name: Make working-directory: ./shared run: make + - name: Test C# binaries + run: | + export R_HOME=/usr/lib/R + dotnet test ./shared/RDotNet.Tests/ -c Release -d log.txt --no-build + dotnet test ./shared/rSharpTests/ -c Release -d log.txt --no-build + dotnet test ./shared/DynamicInterop.Tests/ -c Release -d log.txt --no-build + + - uses: EndBug/add-and-commit@v9 + if: ${{ success() }} + with: + pull: '--verbose' + message: 'Update Linux C# binaries (Commit from Github Actions).' + default_author: github_actions + add: '*linux.so' + + + macOS-Build: + runs-on: macos-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + with: + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.ref }} + + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 8.0.x + - name: Setup R uses: r-lib/actions/setup-r@v2 with: use-public-rspm: true + - name: Make + working-directory: ./shared + run: make + - name: Test C# binaries run: | - export R_HOME=/usr/lib/R + export R_HOME=/Library/Frameworks/R.framework/Resources dotnet test ./shared/RDotNet.Tests/ -c Release -d log.txt --no-build dotnet test ./shared/rSharpTests/ -c Release -d log.txt --no-build dotnet test ./shared/DynamicInterop.Tests/ -c Release -d log.txt --no-build @@ -46,12 +83,13 @@ jobs: - uses: EndBug/add-and-commit@v9 if: ${{ success() }} with: - message: 'Update Linux C# binaries (Commit from Github Actions).' + pull: '--verbose' + message: 'Update macOS C# binaries (Commit from Github Actions).' default_author: github_actions - add: '*.so' + add: '*mac.so' + Windows-Build: - needs: Linux-Build runs-on: windows-latest env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} @@ -59,14 +97,10 @@ jobs: contents: write steps: - uses: actions/checkout@v4 - if: ${{ github.event_name == 'pull_request' }} with: repository: ${{ github.event.pull_request.head.repo.full_name }} ref: ${{ github.event.pull_request.head.ref }} - - uses: actions/checkout@v4 - if: ${{ github.event_name != 'pull_request' }} - - name: Setup .NET uses: actions/setup-dotnet@v1 with: @@ -77,7 +111,6 @@ jobs: with: use-public-rspm: true - - name: Install dependencies run: | nuget restore ./shared/packages.config -PackagesDirectory ./shared/packages @@ -97,10 +130,10 @@ jobs: dotnet test .\shared\rSharpTests\ -c Release -d log.txt --no-build dotnet test .\shared\DynamicInterop.Tests\ -c Release -d log.txt --no-build - - uses: EndBug/add-and-commit@v9 if: ${{ success() }} with: + pull: '--verbose' message: 'Update Windows C# binaries (Commit from Github Actions).' default_author: github_actions add: '*.dll' diff --git a/.github/workflows/pr-workflow.yaml b/.github/workflows/main-workflow.yaml similarity index 50% rename from .github/workflows/pr-workflow.yaml rename to .github/workflows/main-workflow.yaml index e5efa4c1..c5ff2345 100644 --- a/.github/workflows/pr-workflow.yaml +++ b/.github/workflows/main-workflow.yaml @@ -1,13 +1,17 @@ name: PR-Workflow on: + push: + branches: [main] pull_request: workflow_dispatch: - jobs: + + # Detect changes done in C# code base. If no change were done, skim "build-Csharp-binaries" workflow. - changes: + detect-changes: + if: github.event_name == 'pull_request' runs-on: ubuntu-latest permissions: pull-requests: read @@ -17,23 +21,37 @@ jobs: - uses: dorny/paths-filter@v3 id: filter with: + base: ${{ github.ref }} filters: | Csharp: - 'shared/**' build-Csharp-binaries: - needs: changes - if: ${{ needs.changes.outputs.Csharp == 'true' }} + needs: detect-changes + if: ${{ needs.detect-changes.outputs.Csharp == 'true' && github.event_name == 'pull_request'}} uses: ./.github/workflows/build-c#.yaml - R-CMD-Check: - if: ${{ always() }} + + # Automatically bump dev version when a it is a push to main branch + bump-dev-version: needs: build-Csharp-binaries + if: github.event_name != 'pull_request' # only when merging in main/develop branch + uses: Open-Systems-Pharmacology/Workflows/.github/workflows/bump_dev_version_tag_branch.yaml@main + with: + app-id: ${{ vars.VERSION_BUMPER_APPID }} + secrets: + private-key: ${{ secrets.VERSION_BUMPER_SECRET }} + + R-CMD-Check: + if: ${{ !cancelled() }} + needs: bump-dev-version uses: ./.github/workflows/R-CMD-check.yaml + test-coverage: - if: ${{ always() }} + if: ${{ !cancelled() }} needs: [R-CMD-Check] uses: ./.github/workflows/test-coverage.yaml + pkgdown: - if: ${{ always() }} + if: ${{ !cancelled() }} needs: [R-CMD-Check] uses: ./.github/workflows/pkgdown.yaml diff --git a/.github/workflows/merge-workflow.yaml b/.github/workflows/merge-workflow.yaml deleted file mode 100644 index da2e0279..00000000 --- a/.github/workflows/merge-workflow.yaml +++ /dev/null @@ -1,18 +0,0 @@ -name: Merge Workflow - -on: - push: - branches: - - main - workflow_dispatch: - - -jobs: - R-CMD-Check: - uses: ./.github/workflows/R-CMD-check.yaml - test-coverage: - needs: [R-CMD-Check] - uses: ./.github/workflows/test-coverage.yaml - pkgdown: - needs: [R-CMD-Check] - uses: ./.github/workflows/pkgdown.yaml diff --git a/NEWS.md b/NEWS.md index f162d86e..98c3b388 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,10 @@ # rSharp (development version) +## Major changes + +- rSharp is now compatible with macOS (tested on ARM) + + # rSharp 1.0.1 ## Minor improvements and bug fixes diff --git a/R/rSharp-env.R b/R/rSharp-env.R index fc121ef5..86c5727c 100644 --- a/R/rSharp-env.R +++ b/R/rSharp-env.R @@ -1,49 +1,57 @@ -# Environment that holds various global variables and settings for the package. -# It is not exported and should not be directly manipulated by other packages. -rSharpEnv <- new.env(parent = emptyenv()) - -# name of the package. This will be used to retrieve information on the package at run time -rSharpEnv$packageName <- "rSharp" -# Name of the C++ redistributable library -rSharpEnv$msvcrFileName <- "msvcp140.dll" -# The name of the native (C++) library -rSharpEnv$nativePkgName <- "rSharp" -# Name of the .NET library -rSharpEnv$dotnetPkgName <- "ClrFacade" - -# Full type name of the main facade to the interop code written in C# -rSharpEnv$clrFacadeTypeName <- "ClrFacade.ClrFacade" -# Full type name of the test cases -rSharpEnv$testCasesTypeName <- "ClrFacade.TestCases" -# Full name of test object class -rSharpEnv$testObjectTypeName <- "ClrFacade.TestObject" -rSharpEnv$testMethodBindingTypeName <- "ClrFacade.TestMethodBinding" - - -#' Names of the settings stored in rSharpEnv Can be used with `getRSharpSetting()` -#' @export -rSharpSettingNames <- names(rSharpEnv) - -#' @title getRSharpSetting -#' @description Get the value of a global rSharp setting. -#' -#' @param settingName String name of the setting -#' -#' @return Value of the setting stored in rSharpEnv. If the setting does not exist, an error is thrown. -#' @export -#' -#' @examples -#' getRSharpSetting("nativePkgName") -getRSharpSetting <- function(settingName) { - if (!(any(names(rSharpEnv) == settingName))) { - stop(messages$errorPackageSettingNotFound(settingName, rSharpEnv)) - } - - obj <- rSharpEnv[[settingName]] - # Evaluate if the object is a function. This is required since some properties are defined as function reference - if (is.function(obj)) { - return(obj()) - } - - return(obj) -} +# Environment that holds various global variables and settings for the package. +# It is not exported and should not be directly manipulated by other packages. +rSharpEnv <- new.env(parent = emptyenv()) + +# name of the package. This will be used to retrieve information on the package at run time +rSharpEnv$packageName <- "rSharp" +# Name of the C++ redistributable library +rSharpEnv$msvcrFileName <- "msvcp140.dll" +# The name of the package +rSharpEnv$pkgName <- "rSharp" + +# The name of the native (C++) library +rSharpEnv$nativePkgName <- + switch(Sys.info()[['sysname']], + Windows = rSharpEnv$pkgName, + Linux = {paste0(rSharpEnv$pkgName, ".linux")}, + Darwin = {paste0(rSharpEnv$pkgName,".mac")}) + +# Name of the .NET library +rSharpEnv$dotnetPkgName <- "ClrFacade" + +# Full type name of the main facade to the interop code written in C# +rSharpEnv$clrFacadeTypeName <- "ClrFacade.ClrFacade" +# Full type name of the test cases +rSharpEnv$testCasesTypeName <- "ClrFacade.TestCases" +# Full name of test object class +rSharpEnv$testObjectTypeName <- "ClrFacade.TestObject" +rSharpEnv$testMethodBindingTypeName <- "ClrFacade.TestMethodBinding" + + +#' Names of the settings stored in rSharpEnv Can be used with `getRSharpSetting()` +#' @export +rSharpSettingNames <- names(rSharpEnv) + +#' @title getRSharpSetting +#' @description Get the value of a global rSharp setting. +#' +#' @param settingName String name of the setting +#' +#' @return Value of the setting stored in rSharpEnv. If the setting does not exist, an error is thrown. +#' @export +#' +#' @examples +#' getRSharpSetting("nativePkgName") +getRSharpSetting <- function(settingName) { + if (!(any(names(rSharpEnv) == settingName))) { + stop(messages$errorPackageSettingNotFound(settingName, rSharpEnv)) + } + + obj <- rSharpEnv[[settingName]] + # Evaluate if the object is a function. This is required since some properties are defined as function reference + if (is.function(obj)) { + return(obj()) + } + + return(obj) +} diff --git a/R/zzz.R b/R/zzz.R index 2500af6a..3dc758d2 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -1,40 +1,41 @@ -.onLoad <- function(...) { # nocov start - # Check for C++ distrib availability - if (.Platform$OS.type == "windows") { - if (Sys.which(rSharpEnv$msvcrFileName) == "") { - stop(paste(rSharpEnv$msvcrFileName, "was not found on this Windows system.", - "You are probably missing the Visual C++ Redistributable.", - "Go to https://learn.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist?view=msvc-170 and download the latest 'Microsoft Visual C++ Redistributable'", - sep = "\n" - )) - } - } else { - strings <- strsplit(system("ldd --version | grep ldd", intern = TRUE), " +")[[1]] - if (as.numeric(utils::tail(strings, n = 1)) < 2.35) { - stop("a suitable version of glibc was not found. Install glibc >= 2.35") - } - } - - # find installed dotnet runtimes for .NET 8 - if (length(grep("Microsoft.NETCore.App 8", system("dotnet --list-runtimes", intern = TRUE))) == 0) { - stop(" a suitable dotnet runtime was not found. Install dotnet 8 or newer") - } - # Load the C++ and .NET libraries - .loadAndInit() -} - -.loadAndInit <- function() { - # Path to the folder where the libraries are located - srcPkgLibPath <- system.file("lib", package = rSharpEnv$packageName) - - nativeLibrary <- file.path(srcPkgLibPath, paste0(rSharpEnv$nativePkgName, .Platform$dynlib.ext)) - - # Load C++ library - dyn.load(nativeLibrary, DLLpath = srcPkgLibPath) - - # Load .NET library through C++ - # The method returns 0 if successful. Otherwise, an error is thrown. - result <- .External("rSharp_create_domain", srcPkgLibPath, PACKAGE = rSharpEnv$nativePkgName) - # Turn on the the conversion of advanced data types with R.NET. - invisible(callStatic("ClrFacade.ClrFacade", "SetRDotNet", TRUE)) -} # nocov end +.onLoad <- function(...) { # nocov start + # Check for C++ distrib availability + if (.Platform$OS.type == "windows") { + if (Sys.which(rSharpEnv$msvcrFileName) == "") { + stop(paste(rSharpEnv$msvcrFileName, "was not found on this Windows system.", + "You are probably missing the Visual C++ Redistributable.", + "Go to https://learn.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist?view=msvc-170 and download the latest 'Microsoft Visual C++ Redistributable'", + sep = "\n" + )) + } + } else { + + } + + # find installed dotnet runtimes for .NET 8 or higher + if (length(grep("Microsoft.NETCore.App 8", system("dotnet --list-runtimes", intern = TRUE))) == 0) { + stop(paste("No suitable dotnet 8 runtime found. ", + "Please install dotnet 8: go to https://learn.microsoft.com/en-us/dotnet/core/install/ and follow installation instructions.", + sep = "\n") + ) + } + + # Load the C++ and .NET libraries + .loadAndInit() +} + +.loadAndInit <- function() { + # Path to the folder where the libraries are located + srcPkgLibPath <- system.file("lib", package = rSharpEnv$packageName) + nativeLibraryPath <- file.path(srcPkgLibPath, paste0(rSharpEnv$nativePkgName, .Platform$dynlib.ext)) + + # Load C++ library + dyn.load(nativeLibraryPath, DLLpath = srcPkgLibPath) + + # Load .NET library through C++ + # The method returns 0 if successful. Otherwise, an error is thrown. + result <- .External("rSharp_create_domain", srcPkgLibPath, PACKAGE = rSharpEnv$nativePkgName) + + # Turn on the the conversion of advanced data types with R.NET. + invisible(callStatic("ClrFacade.ClrFacade", "SetRDotNet", TRUE)) +} # nocov end diff --git a/inst/extdata/rSharp.Examples.dll b/inst/extdata/rSharp.Examples.dll index 0af259fe8da2fe4d724a2725f05d26518c673f74..4b71389b4a374f5267d40867eb78c35f00f79db2 100644 GIT binary patch delta 258 zcmZqBXwaC@!D9b);--x~Je&f7t8dzQ<*adCqj7EacRMqs%_}%r7(I*<4J=aAjEoEt z(@YF3P0YqE zO#Z?ZAdnlY7Ww|NkmpRcs_lo4`c0o4!X2Xk75oVk1gcgr+@dJ6zj4Kzfb=}I%@??R zSpAI{5*Z8_EErN5(in_@&;ZC!V=w{ImO#=R2vZo6f$TIOOkywvsx$+tvIMG10?HWx TdFDVdklHjLZLv99a4Hi3__;*v delta 258 zcmZqBXwaC@!J=?%$B~UaJe&gI7p2)RAGq$jHN#t8lXD{9<`tYQj2?-JmPsbbmS&b_ zMk$tNDFzmXDaMv2=1FNuhQ>x|iN;9=Cgzp~W@Zcwtc(ndV3L7>frF8O8%ROHUIV6m zlfQ5U2uwXad7|Tz?XE4?wn*NHbm5*H!X2Z4E(la@_svn~b1zq)MPBIkJDV?X`>^^a zG9)rsG9)pWFeC$MGcYz{NCDF+3Lyz7dd>2&9vMYCtlU OK-!GKY;(5YR3-ob^h4kP diff --git a/inst/lib/ClrFacade.dll b/inst/lib/ClrFacade.dll index 11e409dc9a790045c83bfdd73c260c3703f1ae2d..e02011d61d24331bc0664b7fabb58355df8e48fb 100644 GIT binary patch delta 38655 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

mYr;U=*b1 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

0!CZY~XTr?qfLqS97q7%j2AMoTo`1cgp23 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 LH+_t4`TBnWo2d?- diff --git a/inst/lib/RDotNet.dll b/inst/lib/RDotNet.dll index aa630e624a0635ec48c5445339cff948b0087436..da6e610854ace5856b9da94d45868d11d6cf677d 100644 GIT binary patch delta 45189 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 &(cc~I+JJV@;ccCPij@c^DI3jQGsE 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 diff --git a/inst/lib/RSharp.runtimeconfig.json b/inst/lib/RSharp.runtimeconfig.json index c678ffe4..2e5d483f 100644 --- a/inst/lib/RSharp.runtimeconfig.json +++ b/inst/lib/RSharp.runtimeconfig.json @@ -1,12 +1,12 @@ -{ - "runtimeOptions": { - "tfm": "net8.0", - "framework": { - "name": "Microsoft.NETCore.App", - "version": "8.0.0" - }, - "configProperties": { - "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true - } - } -} +{ + "runtimeOptions": { + "tfm": "net8.0", + "framework": { + "name": "Microsoft.NETCore.App", + "version": "8.0.0" + }, + "configProperties": { + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true + } + } +} diff --git a/inst/lib/rSharp.dll b/inst/lib/rSharp.dll index 184c2493faf8a356654f63f2a75312a7d276e605..b33c40005e18732a2ef56a8cb0a6b0395db94daf 100644 GIT binary patch delta 235 zcmZpepx7`$af1RQ^UApi&B~1J%8Ve)1jNih%mT!$K+LvXnUQ^=xiwHxIs*_e0kJ0# zzbR#Bc$3Nw5@LYK@c`K(Kx|RQ&R~%Smz)0If?X11%XVo?_NzJqff`Lyo*bR$w>E1t zb4`w0=e9KVCU&NPf7@Gf*+m!y0{*cxTu88CV`yb%5*G^iH+@AOdpJ;fI%7V&If%B( iXZHoGI&i_3jbSEK)%1M!5QJVvcCg;18 delta 235 zcmZpepx7`$af1RQ^9t68W@W~9WkwKY0%B$$W&vVWAZFXH%*ejb+#0ATodF1#fY=j= z-;}a5yh&vT2{FLrcz|pXAhsxDXRt_v%T51p!7d51WxKQ``&AtQdxhez|Gp=^HkSD3 zo#L|FwJnXkiJi&e|Mr$#b`eGahyUyh7ZPmP7+P7G#DyIGPhXM89uAbA&X~_`4x+8{ h*?qyP4qUKhW0(n5H9em_1fiFa9jtfz?|gRF8vy5xKMnu@ diff --git a/inst/lib/rSharp.so b/inst/lib/rSharp.linux.so similarity index 94% rename from inst/lib/rSharp.so rename to inst/lib/rSharp.linux.so index 7e3c2df1b867b1d6015e6ff22b2f14ff1d1145b0..e08ba0cc6e5b28409bd5a8de3b9b89592f85478f 100755 GIT binary patch delta 5698 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 delta 5767 zcmZ8l3tW^{7XL0XJQQ>W)R|A#71T6M9av2PA3w&|WTHXku0MATFs&>hs7!mTGPahL zrg%4xZfcOSYGyD_3Tle@M#Vs-+>%yIO6;+cwrSgA&$;J*HgWu&`QLl~=W*}-?!DiK z#g)D5DtoWEU1SvX8y1-{$xxEvpY06k?hl-9{&vJn@9xuMV#C)CT{q|2FEfcAgSt_! z3z@iZqw+S4Qp8QVy&3Us)UBxRpl(C8PHQr?m#7}MBS}ghVi~ef_=JO zg}9&F3ylNVIEZ=}^%!amD#;1dlc=?*r%)}a$Hp1dv#1T)_#xss)Q?d=K|POZ$*0(8 z(w&Ql&AR;s;$%iCT9u)Fwv`cK1N#RbpB+MoLC!0DtWx35IOqqkW3)p&J zCdE3X9odV@mKK&M*2sb|r`RlgHm5AczE{?VIc0o=Yh}1g{6)5gJH<XuGBuJ6Y`v>& zg&h(_gYQf77HR%4>VnX&5n-Pt1@7QC?w}MbS=K7nLY>N)hcA->Ff!X{p2< zHQNw1qbTX?=oCIxV?QqSWW{};yhAC6C{c3?sM;AFUASU2$2Az|7DuEXf6M5hh&WZz z-ia35(GelTD+BSYo$v15ftm3lx8@@lM0e8tbEbD~%u$m|S4 zoRckGJ`%}+>aJDo1Sad2C0b-tH@BD)aKuGNb-aJVeNUy#n*ZRe{HJC=o+q374u!g5 zVWEL3eN&|{@v*aK3D?Y+F?KBpuqVFj~xY4K`xPVO+ph3;; zHapTV+8LLTClN-N@woP-e*O&zF^nkVy0*=)FT)9RFxt6zQaOrmZ`gJJOxa^L19S9n z^=zf|8vJ zV%N&rRHt}T{*>xWstfYD8szgK2D7nsBu`QlNA!c539daq~=i8CX*J!mpM0%8}!j<1JM?-YuHsPvf29 zvh3pZisN#+*DcP-W%yer_j;Y;fNVf}wd{V^f86RO19vKfC{Wa-^m zc<^l#y`ol5nz&qSl8qBLMF+nt&&ld^r`((#WtLlmLA<>9*YT{EwdnC8iLvmH5Ao`8ipEPQIZ!ie9S;$n1;2h@SrGJ)|F07 zl#%uo_d9F*IcW7qIL!e#GNS9QvmNvlmO#RGqy?TlqOa1+9;LD!V=u@gdcLL$Z5*a+ z7-zvp^dC%)-XF#^z12yc20zjJG`&I}-uBF5bQ94-x^Z;kezv2xlD~l?fb>~Sm(#}( zN|GLVZ}1S^KaQg>&?g7VFPgp!3W(0sboRfPru&TKAt*sQ=?P8O{g=(J=;+wMMURy=ji-( zOdr)_@_A#-I{ygMb2NP!GKn67H!|&m z>=R7uQ)?^*AJJPheStpLP;N39HQ*=uyr$!KvHg;!zlSEGC&zR0x;BgYAUJj+{fwqp z=!@67K9+)q=yev|CVD#*5dE{Ji}k1FD1*fTB}C6m;M$3$Y>w6Re5fb7LDLzU_UL8# z3Pc6cV|#M6T~7?(ze=(oiRe0u*4x24d$&Oj(RsZ%I%6$I#pvXPP(<_@q=kVetWeu^ z@)oEj`kvk#UEJpMJPNHuFVXahVh-z%uVRvQkWd-n?0ymH7<{0wKE&n{2IFV4tFK2p zWTKc244;4`q8B0E6X_LkynI=j zz6Lo+3old?{27V}9%9I2<1&V~7-|^KL&6^P{FZw*$i$x6uOBXi(aosT?{e$VC4-Ng zXE1CBKRNF~XBu$Ud>*jgG)A-XvW4`wW^4z?`xt!(cnC%@WH8KBU_On`l;!&?Y|CW)qJDKRVm)MVim{79Qa=a2&uSxeN;!iWHa|b*>9-a_xr#iaE>9UohMO z^<*5ykijq)#6dJJ*2d0;4y;gsGLHTuo* zA>A;VC@=FJP5sVK47Z5cVn!-?|z*d@SWe%`C1X{_f zGZYcHxHk~0srN@VX0!1*hBqMLIC49=SHp0T!2>?zY?DXeh}2tj75K@y6L?M_6!RwR z10~c;0tdm}%w;Pu{UdoY$Mv&2su%4f6ri)M5$Sl9`KC%@Ge%kSiGg}b*N*|uBKFKo zr0M?X-eyNW#`Hd%IU diff --git a/inst/lib/rSharp.mac.so b/inst/lib/rSharp.mac.so new file mode 100755 index 0000000000000000000000000000000000000000..e2a3571ca32583e85a9cda0f63d308da97def96a GIT binary patch literal 145744 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�yfXCx|-Y9Kf&wdqrY!vQ{JGGUq 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 args) { - var nat = new UnmanagedDll("libdl.so"); + var nat = new UnmanagedDll("libdl"); var open = nat.GetFunction("dlopen"); var error = nat.GetFunction("dlerror"); var handle = open(args[0], 0x01); diff --git a/shared/DynamicInterop.Tests/WrapDynamicLibrary.cs b/shared/DynamicInterop.Tests/WrapDynamicLibrary.cs index 43e8ae7c..32cc1a5c 100644 --- a/shared/DynamicInterop.Tests/WrapDynamicLibrary.cs +++ b/shared/DynamicInterop.Tests/WrapDynamicLibrary.cs @@ -35,19 +35,27 @@ private void CreateLib(string fname) [Fact] public void WellKnownSystemDll() { - if (PlatformUtility.IsUnix) + if (PlatformUtility.IsLinux) TestLoadLibc(); + else if (PlatformUtility.IsMacOSX) + TestLoadSystem(); else if (Environment.OSVersion.Platform == PlatformID.Win32NT) TestLoadKernel32(); else throw new NotSupportedException(PlatformUtility.GetPlatformNotSupportedMsg()); } + + private void TestLoadSystem() + { + using (var dll = new UnmanagedDll("/usr/lib/libSystem.dylib")) + { + var m = dll.GetFunction(); + Assert.NotNull(m); + } + } private void TestLoadLibc() { - // TODO: obviously need to generalize this. - - //nm -D --defined-only /lib/x86_64-linux-gnu/libc.so.6 | less using (var dll = new UnmanagedDll("/lib/x86_64-linux-gnu/libc.so.6")) { var m = dll.GetFunction(); diff --git a/shared/DynamicInterop/PlatformUtility.cs b/shared/DynamicInterop/PlatformUtility.cs index 2db505f0..799badf7 100644 --- a/shared/DynamicInterop/PlatformUtility.cs +++ b/shared/DynamicInterop/PlatformUtility.cs @@ -14,12 +14,21 @@ public static class PlatformUtility ///

/// Is the platform unix-like (Unix or MacOX) /// - public static bool IsUnix + public static bool IsLinux { get { var p = GetPlatform(); - return p == PlatformID.MacOSX || p == PlatformID.Unix; + return p == PlatformID.Unix; + } + } + + public static bool IsMacOSX + { + get + { + var p = GetPlatform(); + return p == PlatformID.MacOSX; } } diff --git a/shared/DynamicInterop/SafeHandleUnmanagedDll.cs b/shared/DynamicInterop/SafeHandleUnmanagedDll.cs index edbd4759..d8f4925f 100644 --- a/shared/DynamicInterop/SafeHandleUnmanagedDll.cs +++ b/shared/DynamicInterop/SafeHandleUnmanagedDll.cs @@ -10,7 +10,7 @@ internal sealed class SafeHandleUnmanagedDll : SafeHandleZeroOrMinusOneIsInvalid public SafeHandleUnmanagedDll(string dllName) : base(true) { IDynamicLibraryLoader libraryLoader = null; - if (PlatformUtility.IsUnix) + if (PlatformUtility.IsLinux || PlatformUtility.IsMacOSX) libraryLoader = new UnixLibraryLoader(); else if (Environment.OSVersion.Platform == PlatformID.Win32NT) libraryLoader = new WindowsLibraryLoader(); diff --git a/shared/DynamicInterop/UnixLibraryLoader.cs b/shared/DynamicInterop/UnixLibraryLoader.cs index 69fc86f0..72f30f0c 100644 --- a/shared/DynamicInterop/UnixLibraryLoader.cs +++ b/shared/DynamicInterop/UnixLibraryLoader.cs @@ -95,13 +95,13 @@ internal static IntPtr InternalLoadLibrary(string filename, int lazy) private static int _so; - [DllImport("libdl.so", EntryPoint = "dlopen")] + [DllImport("libdl", EntryPoint = "dlopen")] private static extern IntPtr dlopen1([MarshalAs(UnmanagedType.LPStr)] string filename, int flag); [DllImport("libdl.so.2", EntryPoint = "dlopen")] private static extern IntPtr dlopen2([MarshalAs(UnmanagedType.LPStr)] string filename, int flag); - [DllImport("libdl.so", EntryPoint = "dlerror")] + [DllImport("libdl", EntryPoint = "dlerror")] [return: MarshalAs(UnmanagedType.LPStr)] private static extern string dlerror1(); @@ -109,7 +109,7 @@ internal static IntPtr InternalLoadLibrary(string filename, int lazy) [return: MarshalAs(UnmanagedType.LPStr)] private static extern string dlerror2(); - [DllImport("libdl.so", EntryPoint = "dlclose")] + [DllImport("libdl", EntryPoint = "dlclose")] [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] private static extern int dlclose1(IntPtr hModule); @@ -117,7 +117,7 @@ internal static IntPtr InternalLoadLibrary(string filename, int lazy) [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] private static extern int dlclose2(IntPtr hModule); - [DllImport("libdl.so", EntryPoint = "dlsym")] + [DllImport("libdl", EntryPoint = "dlsym")] private static extern IntPtr dlsym1(IntPtr hModule, [MarshalAs(UnmanagedType.LPStr)] string lpProcName); [DllImport("libdl.so.2", EntryPoint = "dlsym")] diff --git a/shared/DynamicInterop/UnmanagedDll.cs b/shared/DynamicInterop/UnmanagedDll.cs index 25006cb0..e1dd0469 100644 --- a/shared/DynamicInterop/UnmanagedDll.cs +++ b/shared/DynamicInterop/UnmanagedDll.cs @@ -56,33 +56,12 @@ public UnmanagedDll(string dllName) private void ReportLoadLibError(string dllName, string nativeError) { ThrowFailedLibraryLoad(dllName, nativeError); -/* - * string dllFullName = dllName; - if (File.Exists(dllFullName)) - ThrowFailedLibraryLoad(dllFullName); - else - { - // This below assumes that the PATH environment variable is what is relied on - // TODO: check whether there is more to it: http://msdn.microsoft.com/en-us/library/ms682586.aspx - - // Also some pointers to relevant information if we want to check whether the attempt to load - // was made on a 32 or 64 bit library - // For Windows: - // http://stackoverflow.com/questions/1345632/determine-if-an-executable-or-library-is-32-or-64-bits-on-windows - // http://www.neowin.net/forum/topic/732648-check-if-exe-is-x64/?p=590544108#entry590544108 - // Linux, and perhaps MacOS; the 'file' command seems the way to go. - // http://stackoverflow.com/questions/5665228/in-linux-determine-if-a-a-library-archive-32-bit-or-64-bit - - dllFullName = FindFullPath(dllName, throwIfNotFound: true); - ThrowFailedLibraryLoad(dllFullName); - } - */ } [Obsolete("This message is likely to be too distribution specific", true)] private string createLdLibPathMsg() { - if (!PlatformUtility.IsUnix) + if (!PlatformUtility.IsLinux || PlatformUtility.IsMacOSX) return null; //var sampleldLibPaths = "/usr/local/lib/R/lib:/usr/local/lib:/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server"; var ldLibPathEnv = Environment.GetEnvironmentVariable("LD_LIBRARY_PATH"); diff --git a/shared/R.NET/NativeLibrary/NativeUtility.cs b/shared/R.NET/NativeLibrary/NativeUtility.cs index 44b7adbb..99e92bb7 100644 --- a/shared/R.NET/NativeLibrary/NativeUtility.cs +++ b/shared/R.NET/NativeLibrary/NativeUtility.cs @@ -566,7 +566,7 @@ public static string GetRLibraryFileName() return "R.dll"; case PlatformID.MacOSX: - return "libR.dylib"; + return "/Library/Frameworks/R.framework/Resources/lib/libR.dylib"; case PlatformID.Unix: return "libR.so"; @@ -577,14 +577,23 @@ public static string GetRLibraryFileName() } /// - /// Is the platform a unix like (Unix or MacOX) + /// Is the platform a linux /// - public static bool IsUnix + public static bool IsLinux { get { var p = GetPlatform(); - return p == PlatformID.MacOSX || p == PlatformID.Unix; + return p == PlatformID.Unix; + } + } + + public static bool IsMac + { + get + { + var p = GetPlatform(); + return p == PlatformID.MacOSX; } } } diff --git a/shared/R.NET/REngine.cs b/shared/R.NET/REngine.cs index c2f2842f..261e72fc 100644 --- a/shared/R.NET/REngine.cs +++ b/shared/R.NET/REngine.cs @@ -286,7 +286,7 @@ private static void DetermineCompatibility(REngine engine) // compatibility version to support R 3.5+ engine.Compatibility = CompatibilityMode.ALTREP; - if (NativeUtility.IsUnix) + if (NativeUtility.IsLinux || NativeUtility.IsMac) // engine.DllVersion is not implemented because the R native library has no entry point to getDllVersion which is Windows only. // Not sure yet if there is a way to programatically query the R version on Linux, without bumping in a chicken and egg problem. return; diff --git a/shared/RDotNet.TestBase/RDotNetTestFixture.cs b/shared/RDotNet.TestBase/RDotNetTestFixture.cs index da63ad94..e9c1bc5c 100644 --- a/shared/RDotNet.TestBase/RDotNetTestFixture.cs +++ b/shared/RDotNet.TestBase/RDotNetTestFixture.cs @@ -29,7 +29,7 @@ protected REngine Engine protected static void ReportFailOnLinux(string additionalMsg) { - if (NativeUtility.IsUnix) + if (NativeUtility.IsLinux || NativeUtility.IsMac) throw new NotSupportedException("This unit test is problematic to run from NUnit on Linux " + additionalMsg); } diff --git a/shared/makefile b/shared/makefile index c4156c86..416eb2ea 100644 --- a/shared/makefile +++ b/shared/makefile @@ -6,8 +6,15 @@ OUT_DIR := out SRC_DIR := . SRC_FILES := $(wildcard $(SRC_DIR)/*.cpp) OBJ_FILES := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES)) -SHLIB_EXT := .so INSTDIR= ../inst +UNAME := $(shell uname) + +ifeq ($(UNAME), Darwin) + OUTPUT := rSharp.mac.so + RUNTIME := osx +else + OUTPUT := rSharp.linux.so +endif # only nuget supports packages.config NUGET_CMD=nuget @@ -28,22 +35,30 @@ RM = rm -f # .PHONY: all clean -all: printarch instdir rSharpLib $(OUT_DIR)/rSharp.so rSharpInstrSharpUX +all: printarch instdir rSharpLib $(OUT_DIR)/$(OUTPUT) rSharpInstrSharpUX clean: ${RM} $(OUT_DIR)/* $(OBJ_DIR)/* $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp -@mkdir -p $(OBJ_DIR) 2>/dev/null - $(CXX) -std=c++11 -Ipackages/Microsoft.NETCore.App.Host.linux-x64.8.0.2/runtimes/linux-x64/native $(ALL_CPPFLAGS) -I/usr/share/R/include/ $(ALL_CFLAGS) -fPIC -c $< -o $@ -lsupc++ +ifeq ($(UNAME), Darwin) + $(CXX) -std=c++11 -Ipackages/Microsoft.NETCore.App.Host.osx-arm64.8.0.2/runtimes/osx-arm64/native $(ALL_CPPFLAGS) -I/Library/Frameworks/R.framework/Resources/include -I/usr/share/R/include/ $(ALL_CFLAGS) -fPIC -c $< -o $@ -lsupc++ +else + $(CXX) -std=c++11 -Ipackages/Microsoft.NETCore.App.Host.linux-x64.8.0.2/runtimes/linux-x64/native $(ALL_CPPFLAGS) -I/usr/share/R/include/ $(ALL_CFLAGS) -fPIC -c $< -o $@ -lsupc++ +endif -$(OUT_DIR)/rSharp.so: $(OBJ_FILES) +$(OUT_DIR)/$(OUTPUT): $(OBJ_FILES) -@mkdir -p $(OUT_DIR) 2>/dev/null - $(CXX) -std=c++11 -shared -Wl,-z,relro -o $@ $^ $(ALL_LIBS) -L./packages/Microsoft.NETCore.App.Host.linux-x64.8.0.2/runtimes/linux-x64/native -l:libnethost.a +ifeq ($(UNAME), Darwin) + $(CXX) -std=c++11 -shared -Wl, -o $@ $^ $(ALL_LIBS) ./packages/Microsoft.NETCore.App.Host.osx-arm64.8.0.2/runtimes/osx-arm64/native/libnethost.a -L/Library/Frameworks/R.framework/Resources/lib -lR +else + $(CXX) -std=c++11 -shared -Wl,-z,relro -o $@ $^ $(ALL_LIBS) -L./packages/Microsoft.NETCore.App.Host.linux-x64.8.0.2/runtimes/linux-x64/native -l:libnethost.a +endif printarch: -@echo **Variable information only for diagnosis purposes** - -@echo SHLIB_EXT=$(SHLIB_EXT) + -@echo $(OUTPUT) -@echo CC=$(CC) -@echo CXX=$(CXX) -@echo **END Variable** @@ -53,13 +68,21 @@ instdir: -@mkdir -p $(INSTDIR) 2>/dev/null -@mkdir -p $(INSTDIR)/lib$(R_ARCH) 2>/dev/null -rSharpInstrSharpUX: $(OUT_DIR)/rSharp.so +rSharpInstrSharpUX: $(OUT_DIR)/$(OUTPUT) +ifeq ($(UNAME), Darwin) + cp -p $< $(INSTDIR)/lib$(R_ARCH) +else cp -u -p $< $(INSTDIR)/lib$(R_ARCH) +endif rSharpLib: rSharpLibComp +ifeq ($(UNAME), Darwin) + if [ -e symbols.rds ] ; then cp -p symbols.rds $(INSTDIR)/lib$(R_ARCH) ; fi + -cp -p ./$(RUNTIMECONFIG).json $(INSTDIR)/lib/ +else if [ -e symbols.rds ] ; then cp -u -p symbols.rds $(INSTDIR)/lib$(R_ARCH) ; fi - -cp -u -p ./$(RUNTIMECONFIG).json $(INSTDIR)/lib/ +endif rSharpNugetRestore: -$(NUGET_CMD) restore packages.config -PackagesDirectory packages diff --git a/shared/packages.config b/shared/packages.config index 1a4dcf98..85642b59 100644 --- a/shared/packages.config +++ b/shared/packages.config @@ -2,4 +2,5 @@ + \ No newline at end of file diff --git a/shared/rSharp.cpp b/shared/rSharp.cpp index b5abeeea..0f18727e 100644 --- a/shared/rSharp.cpp +++ b/shared/rSharp.cpp @@ -99,7 +99,7 @@ SEXP rSharp_create_domain(SEXP args) delete[] wideStringPath; } - catch (const std::exception& ex) + catch (const std::runtime_error& ex) { error_return(ex.what()) } @@ -579,7 +579,7 @@ SEXP r_create_clr_object(SEXP parameters) { methodParameters = sexp_to_parameters(sExpressionMethodParameter); } - catch (const std::exception& ex) + catch (const std::runtime_error& ex) { free(ns_qualified_typename); error_return(ex.what()) @@ -593,7 +593,7 @@ SEXP r_create_clr_object(SEXP parameters) free_params_array(methodParameters, numberOfObjects); return ConvertToSEXP(return_value); } - catch (const std::exception& ex) + catch (const std::runtime_error& ex) { free(ns_qualified_typename); free_params_array(methodParameters, numberOfObjects); @@ -695,7 +695,7 @@ SEXP r_get_object_direct() auto return_value = getCurrentObjectDirect(); return ConvertToSEXP(return_value); } - catch (const std::exception& ex) + catch (const std::runtime_error& ex) { error_return(ex.what()) } @@ -746,7 +746,7 @@ SEXP r_get_typename_externalptr(SEXP parameters) auto return_value = get_type_full_name(reinterpret_cast(sExpressionNameParameter)); return mkString(return_value); } - catch (const std::exception& ex) + catch (const std::runtime_error& ex) { error_return(ex.what()) } @@ -788,7 +788,7 @@ SEXP r_call_method(SEXP parameters) { params = sexp_to_parameters(sExpressionParameterStack); } - catch (const std::exception& ex) + catch (const std::runtime_error& ex) { error_return(ex.what()) } @@ -800,7 +800,7 @@ SEXP r_call_method(SEXP parameters) free_params_array(params, numberOfObjects); return ConvertToSEXP(return_value); } - catch (const std::exception& ex) + catch (const std::runtime_error& ex) { free_params_array(params, numberOfObjects); error_return(ex.what()) @@ -827,7 +827,7 @@ SEXP r_call_static_method(SEXP parameters) { methodParameters = sexp_to_parameters(sExpressionMethodParameter); } - catch (const std::exception& ex) + catch (const std::runtime_error& ex) { free(ns_qualified_typename); error_return(ex.what()) @@ -846,7 +846,7 @@ SEXP r_call_static_method(SEXP parameters) free_params_array(methodParameters, numberOfObjects); return ConvertToSEXP(return_value); } - catch (const std::exception& ex) + catch (const std::runtime_error& ex) { free(ns_qualified_typename); free_params_array(methodParameters, numberOfObjects); diff --git a/tests/testthat/test-basic.R b/tests/testthat/test-basic.R index bb5be93c..6186711c 100644 --- a/tests/testthat/test-basic.R +++ b/tests/testthat/test-basic.R @@ -1,131 +1,133 @@ -test_that("Methods with variable number of parameters with c# 'params' keyword", { - testObj <- newObjectFromName(rSharpEnv$testObjectTypeName) - actual <- testObj$call("TestParams", "Hello, ", "World!", 1L, 2L, 3L, 6L, 5L, 4L) - expected <- "Hello, World!123654" - expect_equal(actual, expected = expected) - actual <- testObj$call("TestParams", "Hello, ", "World!", as.integer(1:6)) - expected <- "Hello, World!123456" - expect_equal(actual, expected = expected) -}) - -test_that("Vignette examples work", { - assemblyPath <- system.file("extdata", "rSharp.Examples.dll", package = "rSharp") - expect_true(loadAssembly(assemblyPath)) - testObj <- newObjectFromName("rSharp.Examples.SampleInstanceClass") - expect_equal(callStatic("rSharp.Examples.SampleStaticClass", "GetAString"), "A string from static class") - expect_equal(testObj$call("GetAString"), "A string from instance class") -}) - -test_that("Correct method binding based on parameter types", { - mkArrayTypeName <- function(typeName) { - paste(typeName, "[]", sep = "") - } - f <- function(...) { - callStatic("ClrFacade.TestMethodBinding", "SomeStaticMethod", ...) - } - printIfDifferent <- function(got, expected) { - if (any(got != expected)) { - print(paste("got", got, ", expected", expected)) - } - } - g <- function(values, typeName) { - if (is.list(values)) { # this is what one gets with a concatenation of S4 objects, when we use c(testObj,testObj) with CLR objects - printIfDifferent(f(values[[1]]), typeName) - printIfDifferent(f(values), mkArrayTypeName(typeName)) # This is not yet supported? - printIfDifferent(f(values[[1]], values[[2]]), rep(typeName, 2)) - expect_equal(f(values[[1]]), typeName) - expect_equal(f(values), mkArrayTypeName(typeName)) - expect_equal(f(values[[1]], values[[2]]), rep(typeName, 2)) - } else { - printIfDifferent(f(values[1]), typeName) - printIfDifferent(f(values), mkArrayTypeName(typeName)) - printIfDifferent(f(values[1], values[2]), rep(typeName, 2)) - expect_equal(f(values[1]), typeName) - expect_equal(f(values), mkArrayTypeName(typeName)) - expect_equal(f(values[1], values[2]), rep(typeName, 2)) - } - } - intName <- "System.Int32" - doubleName <- "System.Double" - stringName <- "System.String" - boolName <- "System.Boolean" - dateTimeName <- "System.DateTime" - objectName <- "System.Object" - testObj <- newObjectFromName(rSharpEnv$testObjectTypeName) - - testMethodBinding <- function() { - g(1:3, intName) - g(1.2 * 1:3, doubleName) - g(letters[1:3], stringName) - g(rep(TRUE, 3), boolName) - g(as.Date("2001-01-01") + 1:3, dateTimeName) - g(c(testObj, testObj, testObj), objectName) - - expect_equal(f(1.0, "a"), c(doubleName, stringName)) - expect_equal(f(1.0, "a", "b"), c(doubleName, stringName, stringName)) - expect_equal(f(1.0, letters[1:2]), c(doubleName, mkArrayTypeName(stringName))) - expect_equal(f(1.0, letters[1:10]), c(doubleName, mkArrayTypeName(stringName))) - - expect_equal(f("a", letters[1:3]), c(stringName, mkArrayTypeName(stringName))) - expect_equal(f(letters[1:3], "a"), c(mkArrayTypeName(stringName), stringName)) - expect_equal(f(letters[1:3], letters[4:6]), c(mkArrayTypeName(stringName), mkArrayTypeName(stringName))) - } - testMethodBinding() - obj <- newObjectFromName("ClrFacade.TestMethodBinding") - f <- function(...) { - obj$call("SomeInstanceMethod", ...) - } - testMethodBinding() - # Test that methods implemented to comply with an interface are found, even if the method is explicitely implemented. - # We do not want the users to have to figure out which interface type they deal with, at least not for R users. - f <- function(...) { - obj$call("SomeExplicitlyImplementedMethod", ...) - } - testMethodBinding() -}) - -test_that("Conversion of non-bijective types can be turned on/off", { - # When the conversion is turned off, a `NetObject` is returned, which holds a reference to the .NET object. - setConvertAdvancedTypes(FALSE) - expect_true(is(callTestCase("CreateStringDictionary"), "NetObject")) - expect_true(is(callTestCase("CreateStringDoubleArrayDictionary"), "NetObject")) - # When the conversion is turned on, the .NET object is converted to an R list. - setConvertAdvancedTypes(TRUE) - expect_equal(callTestCase("CreateStringDictionary"), list(a = "A", b = "B")) - expect_equal(callTestCase("CreateStringDoubleArrayDictionary"), list(a = c(1.0, 2.0, 3.0, 3.5, 4.3, 11), b = c(1.0, 2.0, 3.0, 3.5, 4.3), c = c(2.2, 3.3, 6.5))) -}) - -test_that("toStringNET works for primitive types", { - expect_equal(toStringNET(1), "1") - expect_equal(toStringNET(1.0), "1") - expect_equal(toStringNET("a"), "a") - expect_equal(toStringNET(TRUE), "True") - expect_equal(toStringNET(FALSE), "False") - # Check of correct behavior - # expect_equal(toStringNET(NA), "null") - expect_equal(toStringNET(NULL), "null") - expect_equal(toStringNET(NaN), "NaN") -}) - -test_that("Print traceback", { - expected <- "Type: System.Exception -Message: An exception designed with a particular stack trace length -Method: Void ThrowException(Int32) -Stack trace: - at ClrFacade.TestCases.ThrowException(Int32 stackDepth) - at ClrFacade.TestCases.ThrowException(Int32 stackDepth) - at ClrFacade.TestCases.ThrowException(Int32 stackDepth) - at ClrFacade.TestCases.ThrowException(Int32 stackDepth) - at ClrFacade.TestCases.ThrowException(Int32 stackDepth) - at ClrFacade.TestCases.ThrowException(Int32 stackDepth) - at ClrFacade.TestCases.ThrowException(Int32 stackDepth) - at ClrFacade.TestCases.ThrowException(Int32 stackDepth) - at ClrFacade.TestCases.ThrowException(Int32 stackDepth) - at ClrFacade.TestCases.ThrowException(Int32 stackDepth) - at InvokeStub_TestCases.ThrowException(Object, Span`1) - at System.Reflection.MethodBaseInvoker.InvokeWithOneArg(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)" - - expect_error(callStatic(rSharpEnv$testCasesTypeName, "ThrowException", 10L)) # will be truncated by the Rf_error API - # Dont know how to test only for the first xx lines of code. The message thrown when executing tests is different from the one thrown when running the code in the console. - # expect_output(printTraceback(), expected, fixed = TRUE) # prints the full stack trace -}) +test_that("Methods with variable number of parameters with c# 'params' keyword", { + testObj <- newObjectFromName(rSharpEnv$testObjectTypeName) + actual <- testObj$call("TestParams", "Hello, ", "World!", 1L, 2L, 3L, 6L, 5L, 4L) + expected <- "Hello, World!123654" + expect_equal(actual, expected = expected) + actual <- testObj$call("TestParams", "Hello, ", "World!", as.integer(1:6)) + expected <- "Hello, World!123456" + expect_equal(actual, expected = expected) +}) + +test_that("Vignette examples work", { + assemblyPath <- system.file("extdata", "rSharp.Examples.dll", package = "rSharp") + # expect_true(loadAssembly(assemblyPath)) # Returns FALSE on macos but TRUE on other platforms + expect_no_error(loadAssembly(assemblyPath)) + expect_true(isAssemblyLoaded("rSharp.Examples")) + testObj <- newObjectFromName("rSharp.Examples.SampleInstanceClass") + expect_equal(callStatic("rSharp.Examples.SampleStaticClass", "GetAString"), "A string from static class") + expect_equal(testObj$call("GetAString"), "A string from instance class") +}) + +test_that("Correct method binding based on parameter types", { + mkArrayTypeName <- function(typeName) { + paste(typeName, "[]", sep = "") + } + f <- function(...) { + callStatic("ClrFacade.TestMethodBinding", "SomeStaticMethod", ...) + } + printIfDifferent <- function(got, expected) { + if (any(got != expected)) { + print(paste("got", got, ", expected", expected)) + } + } + g <- function(values, typeName) { + if (is.list(values)) { # this is what one gets with a concatenation of S4 objects, when we use c(testObj,testObj) with CLR objects + printIfDifferent(f(values[[1]]), typeName) + printIfDifferent(f(values), mkArrayTypeName(typeName)) # This is not yet supported? + printIfDifferent(f(values[[1]], values[[2]]), rep(typeName, 2)) + expect_equal(f(values[[1]]), typeName) + expect_equal(f(values), mkArrayTypeName(typeName)) + expect_equal(f(values[[1]], values[[2]]), rep(typeName, 2)) + } else { + printIfDifferent(f(values[1]), typeName) + printIfDifferent(f(values), mkArrayTypeName(typeName)) + printIfDifferent(f(values[1], values[2]), rep(typeName, 2)) + expect_equal(f(values[1]), typeName) + expect_equal(f(values), mkArrayTypeName(typeName)) + expect_equal(f(values[1], values[2]), rep(typeName, 2)) + } + } + intName <- "System.Int32" + doubleName <- "System.Double" + stringName <- "System.String" + boolName <- "System.Boolean" + dateTimeName <- "System.DateTime" + objectName <- "System.Object" + testObj <- newObjectFromName(rSharpEnv$testObjectTypeName) + + testMethodBinding <- function() { + g(1:3, intName) + g(1.2 * 1:3, doubleName) + g(letters[1:3], stringName) + g(rep(TRUE, 3), boolName) + g(as.Date("2001-01-01") + 1:3, dateTimeName) + g(c(testObj, testObj, testObj), objectName) + + expect_equal(f(1.0, "a"), c(doubleName, stringName)) + expect_equal(f(1.0, "a", "b"), c(doubleName, stringName, stringName)) + expect_equal(f(1.0, letters[1:2]), c(doubleName, mkArrayTypeName(stringName))) + expect_equal(f(1.0, letters[1:10]), c(doubleName, mkArrayTypeName(stringName))) + + expect_equal(f("a", letters[1:3]), c(stringName, mkArrayTypeName(stringName))) + expect_equal(f(letters[1:3], "a"), c(mkArrayTypeName(stringName), stringName)) + expect_equal(f(letters[1:3], letters[4:6]), c(mkArrayTypeName(stringName), mkArrayTypeName(stringName))) + } + testMethodBinding() + obj <- newObjectFromName("ClrFacade.TestMethodBinding") + f <- function(...) { + obj$call("SomeInstanceMethod", ...) + } + testMethodBinding() + # Test that methods implemented to comply with an interface are found, even if the method is explicitely implemented. + # We do not want the users to have to figure out which interface type they deal with, at least not for R users. + f <- function(...) { + obj$call("SomeExplicitlyImplementedMethod", ...) + } + testMethodBinding() +}) + +test_that("Conversion of non-bijective types can be turned on/off", { + # When the conversion is turned off, a `NetObject` is returned, which holds a reference to the .NET object. + setConvertAdvancedTypes(FALSE) + expect_true(is(callTestCase("CreateStringDictionary"), "NetObject")) + expect_true(is(callTestCase("CreateStringDoubleArrayDictionary"), "NetObject")) + # When the conversion is turned on, the .NET object is converted to an R list. + setConvertAdvancedTypes(TRUE) + expect_equal(callTestCase("CreateStringDictionary"), list(a = "A", b = "B")) + expect_equal(callTestCase("CreateStringDoubleArrayDictionary"), list(a = c(1.0, 2.0, 3.0, 3.5, 4.3, 11), b = c(1.0, 2.0, 3.0, 3.5, 4.3), c = c(2.2, 3.3, 6.5))) +}) + +test_that("toStringNET works for primitive types", { + expect_equal(toStringNET(1), "1") + expect_equal(toStringNET(1.0), "1") + expect_equal(toStringNET("a"), "a") + expect_equal(toStringNET(TRUE), "True") + expect_equal(toStringNET(FALSE), "False") + # Check of correct behavior + # expect_equal(toStringNET(NA), "null") + expect_equal(toStringNET(NULL), "null") + expect_equal(toStringNET(NaN), "NaN") +}) + +test_that("Print traceback", { + expected <- "Type: System.Exception +Message: An exception designed with a particular stack trace length +Method: Void ThrowException(Int32) +Stack trace: + at ClrFacade.TestCases.ThrowException(Int32 stackDepth) + at ClrFacade.TestCases.ThrowException(Int32 stackDepth) + at ClrFacade.TestCases.ThrowException(Int32 stackDepth) + at ClrFacade.TestCases.ThrowException(Int32 stackDepth) + at ClrFacade.TestCases.ThrowException(Int32 stackDepth) + at ClrFacade.TestCases.ThrowException(Int32 stackDepth) + at ClrFacade.TestCases.ThrowException(Int32 stackDepth) + at ClrFacade.TestCases.ThrowException(Int32 stackDepth) + at ClrFacade.TestCases.ThrowException(Int32 stackDepth) + at ClrFacade.TestCases.ThrowException(Int32 stackDepth) + at InvokeStub_TestCases.ThrowException(Object, Span`1) + at System.Reflection.MethodBaseInvoker.InvokeWithOneArg(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)" + + expect_error(callStatic(rSharpEnv$testCasesTypeName, "ThrowException", 10L)) # will be truncated by the Rf_error API + # Dont know how to test only for the first xx lines of code. The message thrown when executing tests is different from the one thrown when running the code in the console. + # expect_output(printTraceback(), expected, fixed = TRUE) # prints the full stack trace +})