diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8eac2a5..9ce344b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,12 +3,12 @@ name: Build on: push: branches: - - 'master' + - "master" tags: - - '*' + - "*" pull_request: branches: - - '*' + - "*" jobs: build: @@ -30,7 +30,7 @@ jobs: - name: install tools run: pip3 install protoc-gen-mavsdk && brew install protobuf - name: generate from protos - run: bash Sources/MAVSDK-Swift/tools/generate_from_protos.bash + run: bash Sources/Mavsdk/tools/generate_from_protos.bash - name: check for diff run: git diff --exit-code generate-docs: @@ -41,9 +41,9 @@ jobs: with: submodules: recursive - name: install tools - run: gem install jazzy && pip install s3cmd + run: gem install jazzy && pip install --user s3cmd - name: generate docs - run: bash Sources/MAVSDK-Swift/tools/generate_docs.sh + run: bash Sources/Mavsdk/tools/generate_docs.sh - name: deploy docs (if master) if: github.ref == 'refs/heads/master' run: s3cmd --acl-public --access_key=${{ secrets.AWS_ACCESS_KEY_ID }} --secret_key=${{ secrets.AWS_SECRET_ACCESS_KEY }} --add-header="Cache-Control:public, max-age=0" put --recursive docs/swift_output/* s3://dronecode-sdk-swift/docs/master/; diff --git a/.gitmodules b/.gitmodules index bd4e196..fa46b30 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "Sources/MAVSDK-Swift/proto"] - path = Sources/MAVSDK-Swift/proto - url = https://github.com/mavlink/mavsdk-proto +[submodule "Sources/Mavsdk/proto"] + path = Sources/Mavsdk/proto + url = https://github.com/mavlink/MAVSDK-Proto.git diff --git a/Package.resolved b/Package.resolved index 777249a..adffc54 100644 --- a/Package.resolved +++ b/Package.resolved @@ -10,6 +10,15 @@ "version": "1.0.0" } }, + { + "package": "MAVSDK-XCFramework", + "repositoryURL": "https://github.com/mavlink/MAVSDK-XCFramework", + "state": { + "branch": null, + "revision": "4a27a60c2caf9c3a2b60befb6ae642f019c24b65", + "version": "0.37.0" + } + }, { "package": "RxSwift", "repositoryURL": "https://github.com/ReactiveX/RxSwift.git", diff --git a/Package.swift b/Package.swift index 6df706f..f5c77b0 100644 --- a/Package.swift +++ b/Package.swift @@ -3,11 +3,15 @@ import PackageDescription let package = Package( - name: "MAVSDK_Swift", + name: "Mavsdk", + platforms: [ + .iOS(.v13), + .macOS(.v10_15) + ], products: [ - .library(name: "MAVSDK_Swift", + .library(name: "Mavsdk", targets: [ - "MAVSDK-Swift", + "Mavsdk", ] ), .library(name: "MavsdkServer", @@ -19,9 +23,10 @@ let package = Package( dependencies: [ .package(url: "https://github.com/grpc/grpc-swift", from: "1.0.0"), .package(url: "https://github.com/ReactiveX/RxSwift.git", from: "5.0.0"), + .package(url: "https://github.com/mavlink/MAVSDK-XCFramework", .exact("0.37.0")) ], targets: [ - .target(name: "MAVSDK-Swift", + .target(name: "Mavsdk", dependencies: [ .product(name: "GRPC", package: "grpc-swift"), .product(name: "RxSwift", package: "RxSwift") @@ -34,17 +39,14 @@ let package = Package( ), .target(name: "MavsdkServer", dependencies: [ - .product(name: "RxSwift", package: "RxSwift"), - "mavsdk_server" + .product(name: "mavsdk_server", + package: "MAVSDK-XCFramework", + condition: .when(platforms: [.iOS, .macOS])) ] ), - .binaryTarget(name: "mavsdk_server", - url: "https://github.com/mavlink/MAVSDK/releases/download/v0.37.0/mavsdk_server.xcframework.zip", - checksum: "7c7c45c4f4ae59a93d6cb5d29d2ccede2424108dc549ce94f7ccd834466de51a"), - .testTarget(name: "MAVSDK-SwiftTests", + .testTarget(name: "MavsdkTests", dependencies: [ - "MAVSDK-Swift", - "MavsdkServer", + "Mavsdk", .product(name: "RxTest", package: "RxSwift"), .product(name: "RxBlocking", package: "RxSwift") ] diff --git a/README.md b/README.md index 454e70e..8980100 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# MAVSDK-Swift +# MAVSDK The official MAVSDK client for Swift. This cross-platform gRPC library communicates to MAVLink compatible systems using a plugin architecture. @@ -9,16 +9,16 @@ The official MAVSDK client for Swift. This cross-platform gRPC library communica Add the following to your Package.swift dependencies: ``` dependencies: [ - .package(url: "https://github.com/mavlink/MAVSDK-Swift", from: "0.9.0"), + .package(url: "https://github.com/mavlink/Mavsdk", from: "0.9.0"), ], ``` And add each product within each target as needed (`MavsdkServer` may be optional): ``` targets: [ - .target(name: "MAVSDK-Swift", + .target(name: "MyTarget", dependencies: [ - .product(name: "MAVSDK-Swift", package: "MAVSDK-Swift"), - .product(name: "MavsdkServer", package: "MAVSDK-Swift") + .product(name: "Mavsdk", package: "Mavsdk"), + .product(name: "MavsdkServer", package: "Mavsdk") ], ), ] @@ -34,7 +34,7 @@ The backend is currently limited to UDP only, even though the core supports UDP, ```swift import MavsdkServer -import MAVSDK_Swift +import Mavsdk let port = mavsdkServer.run() let drone = Drone(port: Int32(port)) @@ -78,7 +78,7 @@ Before contributing, it's a good idea to file an issue on GitHub to get feedback ### Build the SDK -MAVSDK functions are mainly generated from files in the _/proto_ submodule (see _Sources/MAVSDK-Swift/proto_). First, you may need to initialize any uninitialized and nested submodules. +MAVSDK functions are mainly generated from files in the _/proto_ submodule (see _Sources/Mavsdk/proto_). First, you may need to initialize any uninitialized and nested submodules. ```shell git submodule update --init --recursive @@ -102,20 +102,23 @@ pip3 install protoc-gen-mavsdk Then, to generate the source code, run: ```shell -bash Sources/MAVSDK-Swift/tools/generate_from_protos.bash +bash Sources/Mavsdk/tools/generate_from_protos.bash ``` **NOTE**: The following requires Xcode 12 and Swift 5.3. -With your current Xcode project open, you can then locally source MAVSDK-Swift to override the remote Swift Package into your project. Open a Finder window, drag-and-drop the MAVSDK-Swift directory within the top level of your .xcodeproj, then click `File > Swift Packages > Resolve Package Versions` to resolve the package dependencies. +With your current Xcode project open, you can then locally source `Mavsdk` to override the remote Swift Package into your project. Open a Finder window, drag-and-drop the `Mavsdk` directory within the top level of your .xcodeproj, then click `File > Swift Packages > Resolve Package Versions` to resolve the package dependencies. **NOTE**: If you have Xcode 11 and Swift 5.2 or lower and require `MavsdkServer`, use these additional steps. -Move `MavsdkServer.swift` from within the MAVSDK-Swift package into your project. Modify Package.swift to remove the follwing: -- "MavsdkServer" `.library` -- "MavsdkServer" `.target` -- "mavsdk_server" `.binaryTarget` -- "MavsdkServer" reference within "MAVSDK-SwiftTests" `.testTarget`. +Move `MavsdkServer.swift` from within the Mavsdk package into your main project. Modify Package.swift to remove the following: +``` +.library(name: "MavsdkServer", + targets: [ + "mavsdk_server" + ] +) +``` Next, using Finder, download, unzip and move the binary for the iOS MAVSDK server (`mavsdk_server.xcframework`) downloaded from [MAVSDK Releases](https://github.com/mavlink/MAVSDK/releases) into your projects root directory (or where other dependencies may be installed) and update `FRAMEWORK_SEARCH_PATHS` in the Target Build Settings accordingly to find it. @@ -131,5 +134,5 @@ sudo gem install jazzy Then, to generate the docs, run: ``` -bash Sources/MAVSDK-Swift/tools/generate_docs.sh +bash Sources/Mavsdk/tools/generate_docs.sh ``` diff --git a/Sources/MAVSDK-Swift/Drone.swift b/Sources/Mavsdk/Drone.swift similarity index 100% rename from Sources/MAVSDK-Swift/Drone.swift rename to Sources/Mavsdk/Drone.swift diff --git a/Sources/MAVSDK-Swift/Generated/Action.swift b/Sources/Mavsdk/Generated/Action.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Action.swift rename to Sources/Mavsdk/Generated/Action.swift diff --git a/Sources/MAVSDK-Swift/Generated/Calibration.swift b/Sources/Mavsdk/Generated/Calibration.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Calibration.swift rename to Sources/Mavsdk/Generated/Calibration.swift diff --git a/Sources/MAVSDK-Swift/Generated/Camera.swift b/Sources/Mavsdk/Generated/Camera.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Camera.swift rename to Sources/Mavsdk/Generated/Camera.swift diff --git a/Sources/MAVSDK-Swift/Generated/Core.swift b/Sources/Mavsdk/Generated/Core.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Core.swift rename to Sources/Mavsdk/Generated/Core.swift diff --git a/Sources/MAVSDK-Swift/Generated/Failure.swift b/Sources/Mavsdk/Generated/Failure.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Failure.swift rename to Sources/Mavsdk/Generated/Failure.swift diff --git a/Sources/MAVSDK-Swift/Generated/FollowMe.swift b/Sources/Mavsdk/Generated/FollowMe.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/FollowMe.swift rename to Sources/Mavsdk/Generated/FollowMe.swift diff --git a/Sources/MAVSDK-Swift/Generated/Ftp.swift b/Sources/Mavsdk/Generated/Ftp.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Ftp.swift rename to Sources/Mavsdk/Generated/Ftp.swift diff --git a/Sources/MAVSDK-Swift/Generated/Geofence.swift b/Sources/Mavsdk/Generated/Geofence.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Geofence.swift rename to Sources/Mavsdk/Generated/Geofence.swift diff --git a/Sources/MAVSDK-Swift/Generated/Gimbal.swift b/Sources/Mavsdk/Generated/Gimbal.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Gimbal.swift rename to Sources/Mavsdk/Generated/Gimbal.swift diff --git a/Sources/MAVSDK-Swift/Generated/Info.swift b/Sources/Mavsdk/Generated/Info.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Info.swift rename to Sources/Mavsdk/Generated/Info.swift diff --git a/Sources/MAVSDK-Swift/Generated/LogFiles.swift b/Sources/Mavsdk/Generated/LogFiles.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/LogFiles.swift rename to Sources/Mavsdk/Generated/LogFiles.swift diff --git a/Sources/MAVSDK-Swift/Generated/ManualControl.swift b/Sources/Mavsdk/Generated/ManualControl.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/ManualControl.swift rename to Sources/Mavsdk/Generated/ManualControl.swift diff --git a/Sources/MAVSDK-Swift/Generated/Mission.swift b/Sources/Mavsdk/Generated/Mission.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Mission.swift rename to Sources/Mavsdk/Generated/Mission.swift diff --git a/Sources/MAVSDK-Swift/Generated/MissionRaw.swift b/Sources/Mavsdk/Generated/MissionRaw.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/MissionRaw.swift rename to Sources/Mavsdk/Generated/MissionRaw.swift diff --git a/Sources/MAVSDK-Swift/Generated/Mocap.swift b/Sources/Mavsdk/Generated/Mocap.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Mocap.swift rename to Sources/Mavsdk/Generated/Mocap.swift diff --git a/Sources/MAVSDK-Swift/Generated/Offboard.swift b/Sources/Mavsdk/Generated/Offboard.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Offboard.swift rename to Sources/Mavsdk/Generated/Offboard.swift diff --git a/Sources/MAVSDK-Swift/Generated/Param.swift b/Sources/Mavsdk/Generated/Param.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Param.swift rename to Sources/Mavsdk/Generated/Param.swift diff --git a/Sources/MAVSDK-Swift/Generated/Shell.swift b/Sources/Mavsdk/Generated/Shell.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Shell.swift rename to Sources/Mavsdk/Generated/Shell.swift diff --git a/Sources/MAVSDK-Swift/Generated/Telemetry.swift b/Sources/Mavsdk/Generated/Telemetry.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Telemetry.swift rename to Sources/Mavsdk/Generated/Telemetry.swift diff --git a/Sources/MAVSDK-Swift/Generated/TrackingServer.swift b/Sources/Mavsdk/Generated/TrackingServer.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/TrackingServer.swift rename to Sources/Mavsdk/Generated/TrackingServer.swift diff --git a/Sources/MAVSDK-Swift/Generated/Tune.swift b/Sources/Mavsdk/Generated/Tune.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/Tune.swift rename to Sources/Mavsdk/Generated/Tune.swift diff --git a/Sources/MAVSDK-Swift/Generated/action.grpc.swift b/Sources/Mavsdk/Generated/action.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/action.grpc.swift rename to Sources/Mavsdk/Generated/action.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/action.pb.swift b/Sources/Mavsdk/Generated/action.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/action.pb.swift rename to Sources/Mavsdk/Generated/action.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/calibration.grpc.swift b/Sources/Mavsdk/Generated/calibration.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/calibration.grpc.swift rename to Sources/Mavsdk/Generated/calibration.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/calibration.pb.swift b/Sources/Mavsdk/Generated/calibration.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/calibration.pb.swift rename to Sources/Mavsdk/Generated/calibration.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/camera.grpc.swift b/Sources/Mavsdk/Generated/camera.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/camera.grpc.swift rename to Sources/Mavsdk/Generated/camera.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/camera.pb.swift b/Sources/Mavsdk/Generated/camera.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/camera.pb.swift rename to Sources/Mavsdk/Generated/camera.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/core.grpc.swift b/Sources/Mavsdk/Generated/core.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/core.grpc.swift rename to Sources/Mavsdk/Generated/core.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/core.pb.swift b/Sources/Mavsdk/Generated/core.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/core.pb.swift rename to Sources/Mavsdk/Generated/core.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/failure.grpc.swift b/Sources/Mavsdk/Generated/failure.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/failure.grpc.swift rename to Sources/Mavsdk/Generated/failure.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/failure.pb.swift b/Sources/Mavsdk/Generated/failure.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/failure.pb.swift rename to Sources/Mavsdk/Generated/failure.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/follow_me.grpc.swift b/Sources/Mavsdk/Generated/follow_me.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/follow_me.grpc.swift rename to Sources/Mavsdk/Generated/follow_me.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/follow_me.pb.swift b/Sources/Mavsdk/Generated/follow_me.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/follow_me.pb.swift rename to Sources/Mavsdk/Generated/follow_me.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/ftp.grpc.swift b/Sources/Mavsdk/Generated/ftp.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/ftp.grpc.swift rename to Sources/Mavsdk/Generated/ftp.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/ftp.pb.swift b/Sources/Mavsdk/Generated/ftp.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/ftp.pb.swift rename to Sources/Mavsdk/Generated/ftp.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/geofence.grpc.swift b/Sources/Mavsdk/Generated/geofence.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/geofence.grpc.swift rename to Sources/Mavsdk/Generated/geofence.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/geofence.pb.swift b/Sources/Mavsdk/Generated/geofence.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/geofence.pb.swift rename to Sources/Mavsdk/Generated/geofence.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/gimbal.grpc.swift b/Sources/Mavsdk/Generated/gimbal.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/gimbal.grpc.swift rename to Sources/Mavsdk/Generated/gimbal.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/gimbal.pb.swift b/Sources/Mavsdk/Generated/gimbal.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/gimbal.pb.swift rename to Sources/Mavsdk/Generated/gimbal.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/info.grpc.swift b/Sources/Mavsdk/Generated/info.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/info.grpc.swift rename to Sources/Mavsdk/Generated/info.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/info.pb.swift b/Sources/Mavsdk/Generated/info.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/info.pb.swift rename to Sources/Mavsdk/Generated/info.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/log_files.grpc.swift b/Sources/Mavsdk/Generated/log_files.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/log_files.grpc.swift rename to Sources/Mavsdk/Generated/log_files.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/log_files.pb.swift b/Sources/Mavsdk/Generated/log_files.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/log_files.pb.swift rename to Sources/Mavsdk/Generated/log_files.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/manual_control.grpc.swift b/Sources/Mavsdk/Generated/manual_control.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/manual_control.grpc.swift rename to Sources/Mavsdk/Generated/manual_control.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/manual_control.pb.swift b/Sources/Mavsdk/Generated/manual_control.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/manual_control.pb.swift rename to Sources/Mavsdk/Generated/manual_control.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/mission.grpc.swift b/Sources/Mavsdk/Generated/mission.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/mission.grpc.swift rename to Sources/Mavsdk/Generated/mission.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/mission.pb.swift b/Sources/Mavsdk/Generated/mission.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/mission.pb.swift rename to Sources/Mavsdk/Generated/mission.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/mission_raw.grpc.swift b/Sources/Mavsdk/Generated/mission_raw.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/mission_raw.grpc.swift rename to Sources/Mavsdk/Generated/mission_raw.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/mission_raw.pb.swift b/Sources/Mavsdk/Generated/mission_raw.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/mission_raw.pb.swift rename to Sources/Mavsdk/Generated/mission_raw.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/mocap.grpc.swift b/Sources/Mavsdk/Generated/mocap.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/mocap.grpc.swift rename to Sources/Mavsdk/Generated/mocap.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/mocap.pb.swift b/Sources/Mavsdk/Generated/mocap.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/mocap.pb.swift rename to Sources/Mavsdk/Generated/mocap.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/offboard.grpc.swift b/Sources/Mavsdk/Generated/offboard.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/offboard.grpc.swift rename to Sources/Mavsdk/Generated/offboard.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/offboard.pb.swift b/Sources/Mavsdk/Generated/offboard.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/offboard.pb.swift rename to Sources/Mavsdk/Generated/offboard.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/param.grpc.swift b/Sources/Mavsdk/Generated/param.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/param.grpc.swift rename to Sources/Mavsdk/Generated/param.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/param.pb.swift b/Sources/Mavsdk/Generated/param.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/param.pb.swift rename to Sources/Mavsdk/Generated/param.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/shell.grpc.swift b/Sources/Mavsdk/Generated/shell.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/shell.grpc.swift rename to Sources/Mavsdk/Generated/shell.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/shell.pb.swift b/Sources/Mavsdk/Generated/shell.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/shell.pb.swift rename to Sources/Mavsdk/Generated/shell.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/telemetry.grpc.swift b/Sources/Mavsdk/Generated/telemetry.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/telemetry.grpc.swift rename to Sources/Mavsdk/Generated/telemetry.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/telemetry.pb.swift b/Sources/Mavsdk/Generated/telemetry.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/telemetry.pb.swift rename to Sources/Mavsdk/Generated/telemetry.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/tracking_server.grpc.swift b/Sources/Mavsdk/Generated/tracking_server.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/tracking_server.grpc.swift rename to Sources/Mavsdk/Generated/tracking_server.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/tracking_server.pb.swift b/Sources/Mavsdk/Generated/tracking_server.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/tracking_server.pb.swift rename to Sources/Mavsdk/Generated/tracking_server.pb.swift diff --git a/Sources/MAVSDK-Swift/Generated/tune.grpc.swift b/Sources/Mavsdk/Generated/tune.grpc.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/tune.grpc.swift rename to Sources/Mavsdk/Generated/tune.grpc.swift diff --git a/Sources/MAVSDK-Swift/Generated/tune.pb.swift b/Sources/Mavsdk/Generated/tune.pb.swift similarity index 100% rename from Sources/MAVSDK-Swift/Generated/tune.pb.swift rename to Sources/Mavsdk/Generated/tune.pb.swift diff --git a/Sources/MAVSDK-Swift/proto b/Sources/Mavsdk/proto similarity index 100% rename from Sources/MAVSDK-Swift/proto rename to Sources/Mavsdk/proto diff --git a/Sources/MAVSDK-Swift/templates/call.j2 b/Sources/Mavsdk/templates/call.j2 similarity index 100% rename from Sources/MAVSDK-Swift/templates/call.j2 rename to Sources/Mavsdk/templates/call.j2 diff --git a/Sources/MAVSDK-Swift/templates/enum.j2 b/Sources/Mavsdk/templates/enum.j2 similarity index 100% rename from Sources/MAVSDK-Swift/templates/enum.j2 rename to Sources/Mavsdk/templates/enum.j2 diff --git a/Sources/MAVSDK-Swift/templates/file.j2 b/Sources/Mavsdk/templates/file.j2 similarity index 100% rename from Sources/MAVSDK-Swift/templates/file.j2 rename to Sources/Mavsdk/templates/file.j2 diff --git a/Sources/MAVSDK-Swift/templates/initialisms b/Sources/Mavsdk/templates/initialisms similarity index 100% rename from Sources/MAVSDK-Swift/templates/initialisms rename to Sources/Mavsdk/templates/initialisms diff --git a/Sources/MAVSDK-Swift/templates/request.j2 b/Sources/Mavsdk/templates/request.j2 similarity index 100% rename from Sources/MAVSDK-Swift/templates/request.j2 rename to Sources/Mavsdk/templates/request.j2 diff --git a/Sources/MAVSDK-Swift/templates/stream.j2 b/Sources/Mavsdk/templates/stream.j2 similarity index 100% rename from Sources/MAVSDK-Swift/templates/stream.j2 rename to Sources/Mavsdk/templates/stream.j2 diff --git a/Sources/MAVSDK-Swift/templates/struct.j2 b/Sources/Mavsdk/templates/struct.j2 similarity index 100% rename from Sources/MAVSDK-Swift/templates/struct.j2 rename to Sources/Mavsdk/templates/struct.j2 diff --git a/Sources/MAVSDK-Swift/templates/type_conversions b/Sources/Mavsdk/templates/type_conversions similarity index 100% rename from Sources/MAVSDK-Swift/templates/type_conversions rename to Sources/Mavsdk/templates/type_conversions diff --git a/Sources/MAVSDK-Swift/tools/generate_docs.sh b/Sources/Mavsdk/tools/generate_docs.sh similarity index 95% rename from Sources/MAVSDK-Swift/tools/generate_docs.sh rename to Sources/Mavsdk/tools/generate_docs.sh index 7308573..ffed827 100755 --- a/Sources/MAVSDK-Swift/tools/generate_docs.sh +++ b/Sources/Mavsdk/tools/generate_docs.sh @@ -17,4 +17,4 @@ jazzy \ --module-version master \ --root-url https://mavsdk.mavlink.io/docs/swift \ --output docs/swift_output \ - --module MAVSDK_Swift + --module Mavsdk diff --git a/Sources/MAVSDK-Swift/tools/generate_from_protos.bash b/Sources/Mavsdk/tools/generate_from_protos.bash similarity index 100% rename from Sources/MAVSDK-Swift/tools/generate_from_protos.bash rename to Sources/Mavsdk/tools/generate_from_protos.bash diff --git a/Sources/MavsdkServer/MavsdkServer.swift b/Sources/MavsdkServer/MavsdkServer.swift index 35de12d..7e8ca44 100644 --- a/Sources/MavsdkServer/MavsdkServer.swift +++ b/Sources/MavsdkServer/MavsdkServer.swift @@ -1,7 +1,6 @@ #if !os(Linux) import Foundation -import RxSwift -import mavsdk_server +@_implementationOnly import mavsdk_server public class MavsdkServer { private var mavsdkServerHandle: OpaquePointer? = Optional.none @@ -12,7 +11,7 @@ public class MavsdkServer { Run `mavsdk_server`, connecting to the drone. - Parameter systemAddress: The address on which `mavsdk_server` will listen for a MAVLink system. Note that this is about the MAVLink connection between `mavsdk_server` and the drone. - - Parameter mavsdkServerPort: The port on which `mavsdk_server` will listen for a `Drone` object to connect. Note that this is about the connection between MAVSDK-Swift and `mavsdk_server`, and has nothing to do with MAVLink itself. + - Parameter mavsdkServerPort: The port on which `mavsdk_server` will listen for a `Drone` object to connect. Note that this is about the connection between `Mavsdk` and `mavsdk_server`, and has nothing to do with MAVLink itself. */ public func run(systemAddress: String = "udp://:14540", mavsdkServerPort: Int = 0) -> Int { self.mavsdkServerHandle = mavsdk_server_run(systemAddress, Int32(mavsdkServerPort)) diff --git a/Tests/MAVSDK-SwiftTests/ActionTest.swift b/Tests/MAVSDK-SwiftTests/ActionTest.swift deleted file mode 100644 index 7ca5a43..0000000 --- a/Tests/MAVSDK-SwiftTests/ActionTest.swift +++ /dev/null @@ -1,105 +0,0 @@ -import XCTest -import RxBlocking -import RxSwift -import RxTest -@testable import MAVSDK_Swift - -class ActionTest: XCTestCase { - - let ARBITRARY_ALTITUDE: Float = 123.5 - let ARBITRARY_SPEED: Float = 321.5 - - let actionResultsArray: [Mavsdk_Rpc_Action_ActionResult.Result] = [.busy, .commandDenied, .commandDeniedNotLanded, .commandDeniedLandedStateUnknown, .connectionError, .noSystem, .noVtolTransitionSupport, .timeout, .unknown, .vtolTransitionSupportUnknown] - - func testArmSucceedsOnSuccess() throws { - try armWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result.success) - } - - func testArmFailsOnFailure() throws { - try actionResultsArray.forEach { result in - try armWithFakeResult(result: result) - } - } - - func armWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result) throws { - let fakeService = Mavsdk_Rpc_Action_ActionServiceServiceTestStub() - var response = Mavsdk_Rpc_Action_ArmResponse() - response.actionResult.result = result - fakeService.armResponses.append(response) - - let scheduler = TestScheduler(initialClock: 0) - let action = Action(service: fakeService, scheduler: scheduler) - - scheduler.start() - _ = action.arm().toBlocking().materialize() - } - - func testDisarmSucceedsOnSuccess() throws { - try disarmWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result.success) - } - - func testDisarmFailsOnFailure() throws { - try actionResultsArray.forEach { result in - try disarmWithFakeResult(result: result) - } - } - - func disarmWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result) throws { - let fakeService = Mavsdk_Rpc_Action_ActionServiceServiceTestStub() - var response = Mavsdk_Rpc_Action_DisarmResponse() - response.actionResult.result = result - fakeService.disarmResponses.append(response) - - let scheduler = TestScheduler(initialClock: 0) - let client = Action(service: fakeService, scheduler: scheduler) - - scheduler.start() - _ = client.disarm().toBlocking().materialize() - } - - func testReturnToLaunchSucceedsOnSuccess() throws { - try returnToLaunchWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result.success) - } - - func testReturnToLaunchFailsOnFailure() throws { - try actionResultsArray.forEach { result in - try returnToLaunchWithFakeResult(result: result) - } - } - - func returnToLaunchWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result) throws { - let fakeService = Mavsdk_Rpc_Action_ActionServiceServiceTestStub() - var response = Mavsdk_Rpc_Action_ReturnToLaunchResponse() - response.actionResult.result = result - fakeService.returnToLaunchResponses.append(response) - - let scheduler = TestScheduler(initialClock: 0) - let client = Action(service: fakeService, scheduler: scheduler) - - scheduler.start() - _ = client.returnToLaunch().toBlocking().materialize() - } - - func testTransitionToFixedWingsSucceedsOnSuccess() throws { - try transitionToFixedWingsWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result.success) - } - - func testTransitionToFixedWingsFailsOnFailure() throws { - try actionResultsArray.forEach { result in - try transitionToFixedWingsWithFakeResult(result: result) - } - } - - func transitionToFixedWingsWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result) throws { - let fakeService = Mavsdk_Rpc_Action_ActionServiceServiceTestStub() - var response = Mavsdk_Rpc_Action_TransitionToFixedWingResponse() - response.actionResult.result = result - fakeService.transitionToFixedWingResponses.append(response) - - let scheduler = TestScheduler(initialClock: 0) - let client = Action(service: fakeService, scheduler: scheduler) - - scheduler.start() - _ = client.transitionToFixedWing().toBlocking().materialize() - } -} diff --git a/Tests/MAVSDK-SwiftTests/CameraTest.swift b/Tests/MAVSDK-SwiftTests/CameraTest.swift deleted file mode 100644 index eb16378..0000000 --- a/Tests/MAVSDK-SwiftTests/CameraTest.swift +++ /dev/null @@ -1,268 +0,0 @@ -import Foundation -import RxBlocking -import RxSwift -import RxTest -import XCTest -@testable import MAVSDK_Swift - -class CameraTest: XCTestCase { - - let scheduler = MainScheduler.instance - let cameraResultsArray: [Mavsdk_Rpc_Camera_CameraResult.Result] = [.unknown, .error, .busy, .timeout, .inProgress, .denied, .wrongArgument] - - func testTakePhoto() throws { - _ = try takePhotoWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result.success) - } - - func takePhotoWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { - let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() - var response = Mavsdk_Rpc_Camera_TakePhotoResponse() - - response.cameraResult.result = result - fakeService.takePhotoResponses.append(response) - - let client = Camera(service: fakeService, scheduler: scheduler) - - _ = client.takePhoto().toBlocking().materialize() - } - - func testTakePhotoFail() throws { - try cameraResultsArray.forEach { result in - try takePhotoWithFakeResult(result: result) - } - } - - func testStartPhotoInteval() throws { - _ = try startPhotoIntervalWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result.success) - } - - func startPhotoIntervalWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { - let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() - var response = Mavsdk_Rpc_Camera_StartPhotoIntervalResponse() - - response.cameraResult.result = result - fakeService.startPhotoIntervalResponses.append(response) - - let client = Camera(service: fakeService, scheduler: scheduler) - - _ = client.startPhotoInterval(intervalS: 5).toBlocking().materialize() - } - - func testStartPhotoIntervalFail() throws { - try cameraResultsArray.forEach { result in - try startPhotoIntervalWithFakeResult(result: result) - } - } - - func testStopPhotoInterval() throws { - _ = try stopPhotoIntervalWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result.success) - } - - func stopPhotoIntervalWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { - let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() - var response = Mavsdk_Rpc_Camera_StopPhotoIntervalResponse() - - response.cameraResult.result = result - fakeService.stopPhotoIntervalResponses.append(response) - - let client = Camera(service: fakeService, scheduler: scheduler) - - _ = client.stopPhotoInterval().toBlocking().materialize() - } - - func testStopPhotoIntervalFail() throws { - try cameraResultsArray.forEach { result in - try stopPhotoIntervalWithFakeResult(result: result) - } - } - - func testStartVideo() throws { - _ = try startVideoWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result.success) - } - - func startVideoWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { - let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() - var response = Mavsdk_Rpc_Camera_StartVideoResponse() - - response.cameraResult.result = result - fakeService.startVideoResponses.append(response) - - let client = Camera(service: fakeService, scheduler: scheduler) - - _ = client.startVideo().toBlocking().materialize() - } - - func testStartVideoFail() throws { - try cameraResultsArray.forEach { result in - try startVideoWithFakeResult(result:result) - } - } - - func testStopVideo() throws { - _ = try stopPhotoIntervalWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result.success) - } - - func stopVideoWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { - let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() - var response = Mavsdk_Rpc_Camera_StopVideoResponse() // Should fail? - - response.cameraResult.result = result - fakeService.stopVideoResponses.append(response) - - let client = Camera(service: fakeService, scheduler: scheduler) - - _ = client.stopVideo().toBlocking().materialize() - } - - func testStopVideoFail() throws { - try cameraResultsArray.forEach { result in - _ = try stopPhotoIntervalWithFakeResult(result: result) - } - } - - func testStartVideoStreaming() throws { - try startVideoWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result.success) - } - - func startVideoStreamingWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { - let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() - var response = Mavsdk_Rpc_Camera_StartVideoStreamingResponse() - - response.cameraResult.result = result - fakeService.startVideoStreamingResponses.append(response) - - let client = Camera(service: fakeService, scheduler: scheduler) - - _ = client.startVideoStreaming().toBlocking().materialize() - } - - func testStartVideoStreamingFail() throws { - try cameraResultsArray.forEach { result in - try startVideoStreamingWithFakeResult(result: result) - } - } - - func testStopVideoStreaming() throws { - _ = try stopPhotoIntervalWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result.success) - } - - func stopVideoStreamingWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { - let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() - var response = Mavsdk_Rpc_Camera_StopVideoStreamingResponse() - - response.cameraResult.result = result - fakeService.stopVideoStreamingResponses.append(response) - - let client = Camera(service: fakeService, scheduler: scheduler) - - _ = client.stopVideoStreaming().toBlocking().materialize() - } - - func testStopVideoStreamingFail() throws { - try cameraResultsArray.forEach { result in - try stopVideoStreamingWithFakeResult(result: result) - } - } - - func testSetMode() throws { - let cameraModeArray: [Camera.CameraMode] = [.unknown, .photo, .video] - - try cameraModeArray.forEach { mode in - try setModeWithFakeResult(mode: mode, result: Mavsdk_Rpc_Camera_CameraResult.Result.success) - } - } - - func setModeWithFakeResult(mode: Camera.CameraMode, result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { - let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() - var response = Mavsdk_Rpc_Camera_SetModeResponse() - - response.cameraResult.result = result - fakeService.setModeResponses.append(response) - - let client = Camera(service: fakeService, scheduler: scheduler) - - _ = client.setMode(cameraMode: mode).toBlocking().materialize() - } - - func testSetModeFail() throws { - let cameraModeArray: [Camera.CameraMode] = [.unknown, .photo, .video] - - try cameraResultsArray.forEach { result in - try cameraModeArray.forEach { mode in - try setModeWithFakeResult(mode: mode, result: result) - } - } - } - - func testSubscribeModeEmitsNothingWhenNoEvents() { - let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() - let fakeCall = Mavsdk_Rpc_Camera_CameraServiceSubscribeModeCallTestStub() - fakeService.subscribeModeCalls.append(fakeCall) - - let camera = Camera(service: fakeService, scheduler: self.scheduler) - let scheduler = TestScheduler(initialClock: 0) - let observer = scheduler.createObserver(Camera.CameraMode.self) - - let _ = camera.mode.subscribe(observer) - scheduler.start() - - XCTAssertEqual(0, observer.events.count) - } - - func testCameraModeObservableReceivesOneEvent() { - let cameraMode = createRPCCameraMode(status: .photo) - let cameraModeStates = [cameraMode] - - checkSubscribeModeReceivesEvents(cameraModeStates: cameraModeStates) - } - - func testCameraModeObservableReceivesMultipleEvents() { - var cameraModeStates = [Mavsdk_Rpc_Camera_CameraMode]() - cameraModeStates.append(createRPCCameraMode(status: .photo)) - cameraModeStates.append(createRPCCameraMode(status: .video)) - cameraModeStates.append(createRPCCameraMode(status: .unknown)) - - checkSubscribeModeReceivesEvents(cameraModeStates: cameraModeStates) - } - - func checkSubscribeModeReceivesEvents(cameraModeStates: [Mavsdk_Rpc_Camera_CameraMode]) { - let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() - let fakeCall = Mavsdk_Rpc_Camera_CameraServiceSubscribeModeCallTestStub() - - cameraModeStates.forEach { - fakeCall.outputs.append(createCameraModeResponse(cameraMode: $0)) - } - fakeService.subscribeModeCalls.append(fakeCall) - - let camera = Camera(service: fakeService, scheduler: self.scheduler) - let scheduler = TestScheduler(initialClock: 0) - let observer = scheduler.createObserver(Camera.CameraMode.self) - - let _ = camera.mode.subscribe(observer) - scheduler.start() - - var expectedEvents = [Recorded>]() - cameraModeStates.forEach { - expectedEvents.append(next(0, Camera.CameraMode.translateFromRpc($0))) - } - - XCTAssertEqual(expectedEvents.count, observer.events.count) - XCTAssertTrue(observer.events.elementsEqual(expectedEvents, by: { (observed, expected) in - observed.value == expected.value - })) - } - - func createCameraModeResponse(cameraMode: Mavsdk_Rpc_Camera_CameraMode) -> Mavsdk_Rpc_Camera_ModeResponse { - var response = Mavsdk_Rpc_Camera_ModeResponse() - response.cameraMode = cameraMode - - return response - } - - func createRPCCameraMode(status: Mavsdk_Rpc_Camera_CameraMode) -> Mavsdk_Rpc_Camera_CameraMode { - var cameraMode = Mavsdk_Rpc_Camera_CameraMode() - cameraMode = status - - return cameraMode - } -} diff --git a/Tests/MAVSDK-SwiftTests/CoreTest.swift b/Tests/MAVSDK-SwiftTests/CoreTest.swift deleted file mode 100644 index 8255e58..0000000 --- a/Tests/MAVSDK-SwiftTests/CoreTest.swift +++ /dev/null @@ -1,146 +0,0 @@ -import Foundation -import RxBlocking -import RxSwift -import RxTest -import XCTest -@testable import MAVSDK_Swift - -class CoreTest: XCTestCase { - let ARBITRARY_UUID: UInt64 = 42 - let ARBITRARY_PLUGIN_NAME: String = "action" - let ARBITRARY_PLUGIN_ADDRESS: String = "localhost" - let ARBITRARY_PLUGIN_PORT: Int32 = 1291 - - func testConnectionStateObservableEmitsNothingWhenNoEvent() { - let fakeService = Mavsdk_Rpc_Core_CoreServiceServiceTestStub() - let fakeCall = Mavsdk_Rpc_Core_CoreServiceSubscribeConnectionStateCallTestStub() - fakeService.subscribeConnectionStateCalls.append(fakeCall) - - let scheduler = TestScheduler(initialClock: 0) - let client = Core(service: fakeService, scheduler: scheduler) - let observer = scheduler.createObserver(Core.ConnectionState.self) - - let _ = client.connectionState.subscribe(observer) - scheduler.start() - - XCTAssertTrue(observer.events.isEmpty) - } - - func testConnectionStateObservableReceivesOneEvent() { - let fakeService = Mavsdk_Rpc_Core_CoreServiceServiceTestStub() - let fakeCall = Mavsdk_Rpc_Core_CoreServiceSubscribeConnectionStateCallTestStub() - - let expectedConnectionState = Core.ConnectionState(uuid: ARBITRARY_UUID, isConnected: true) - fakeCall.outputs = [createConnectionStateResponse(connectionState: expectedConnectionState)] - fakeService.subscribeConnectionStateCalls.append(fakeCall) - - let scheduler = TestScheduler(initialClock: 0) - let client = Core(service: fakeService, scheduler: scheduler) - let observer = scheduler.createObserver(Core.ConnectionState.self) - - let _ = client.connectionState.subscribe(observer) - scheduler.start() - - let expectedEvents = [ - next(0, expectedConnectionState), - ] - - XCTAssertEqual(expectedEvents.count, observer.events.count) - XCTAssertTrue(observer.events.elementsEqual(expectedEvents, by: { (observed, expected) in - observed.value == expected.value - })) - } - - func createConnectionStateResponse(connectionState: Core.ConnectionState) -> Mavsdk_Rpc_Core_ConnectionStateResponse { - var response = Mavsdk_Rpc_Core_ConnectionStateResponse() - response.connectionState.uuid = connectionState.uuid - response.connectionState.isConnected = connectionState.isConnected - - return response - } - - func testDiscoverObservableReceivesMultipleEvents() { - let fakeService = Mavsdk_Rpc_Core_CoreServiceServiceTestStub() - let fakeCall = Mavsdk_Rpc_Core_CoreServiceSubscribeConnectionStateCallTestStub() - - fakeCall.outputs = [] - var expectedConnectionStates = [Core.ConnectionState]() - expectedConnectionStates.append(Core.ConnectionState(uuid: 4352334, isConnected: false)) - expectedConnectionStates.append(Core.ConnectionState(uuid: 213534, isConnected: true)) - expectedConnectionStates.append(Core.ConnectionState(uuid: 12, isConnected: false)) - expectedConnectionStates.append(Core.ConnectionState(uuid: 9985232, isConnected: false)) - expectedConnectionStates.append(Core.ConnectionState(uuid: 1872358, isConnected: true)) - - for expectedConnectionState in expectedConnectionStates { - fakeCall.outputs.append(createConnectionStateResponse(connectionState: expectedConnectionState)) - } - fakeService.subscribeConnectionStateCalls.append(fakeCall) - - let scheduler = TestScheduler(initialClock: 0) - let client = Core(service: fakeService, scheduler: scheduler) - let observer = scheduler.createObserver(Core.ConnectionState.self) - - let _ = client.connectionState.subscribe(observer) - scheduler.start() - - XCTAssertEqual(expectedConnectionStates.count, observer.events.count) - XCTAssertTrue(observer.events.elementsEqual(expectedConnectionStates.map({ connState in next(1, connState) }), by: { (observed, expected) in observed.value == expected.value})) - } - - func testListRunningPluginsEmitsNothingWhenEmpty() { - let fakeService = Mavsdk_Rpc_Core_CoreServiceServiceTestStub() - fakeService.listRunningPluginsResponses.append(Mavsdk_Rpc_Core_ListRunningPluginsResponse()) - let scheduler = TestScheduler(initialClock: 0) - let client = Core(service: fakeService, scheduler: scheduler) - scheduler.start() - - let pluginInfos = try! client.listRunningPlugins().toBlocking().single() - - XCTAssertTrue(pluginInfos.isEmpty) - } - - func testListRunningPluginsEmitsOnePluginInfo() throws { - let fakeService = Mavsdk_Rpc_Core_CoreServiceServiceTestStub() - var response = Mavsdk_Rpc_Core_ListRunningPluginsResponse() - response.pluginInfo.append(createRPCPluginInfo(name: ARBITRARY_PLUGIN_NAME, address: ARBITRARY_PLUGIN_ADDRESS, port: ARBITRARY_PLUGIN_PORT)) - fakeService.listRunningPluginsResponses.append(response) - let scheduler = TestScheduler(initialClock: 0) - let client = Core(service: fakeService, scheduler: scheduler) - let expectedPluginInfo = Core.PluginInfo.translateFromRpc(response.pluginInfo[0]) - - scheduler.start() - let pluginInfos = try client.listRunningPlugins().toBlocking().single() - - XCTAssertEqual(1, pluginInfos.count) - XCTAssertEqual(expectedPluginInfo, pluginInfos.first) - } - - func createRPCPluginInfo(name: String, address: String, port: Int32) -> Mavsdk_Rpc_Core_PluginInfo { - var pluginInfo = Mavsdk_Rpc_Core_PluginInfo() - pluginInfo.name = ARBITRARY_PLUGIN_NAME - pluginInfo.address = ARBITRARY_PLUGIN_ADDRESS - pluginInfo.port = ARBITRARY_PLUGIN_PORT - - return pluginInfo - } - - func testListRunningPluginsEmitsMultiplePluginInfos() throws { - let fakeService = Mavsdk_Rpc_Core_CoreServiceServiceTestStub() - var response = Mavsdk_Rpc_Core_ListRunningPluginsResponse() - response.pluginInfo.append(createRPCPluginInfo(name: "name1", address: "add1", port: 1291)) - response.pluginInfo.append(createRPCPluginInfo(name: "name2", address: "add2", port: 1492)) - response.pluginInfo.append(createRPCPluginInfo(name: "name3", address: "add3", port: 1515)) - fakeService.listRunningPluginsResponses.append(response) - let scheduler = TestScheduler(initialClock: 0) - let client = Core(service: fakeService, scheduler: scheduler) - - scheduler.start() - let pluginInfos = try client.listRunningPlugins().toBlocking().single() - - XCTAssertEqual(pluginInfos.count, response.pluginInfo.count) - - for i in 0 ... pluginInfos.count - 1 { - XCTAssertEqual(Core.PluginInfo.translateFromRpc(response.pluginInfo[i]), pluginInfos[i]) - } - } -} diff --git a/Tests/MAVSDK-SwiftTests/MissionTest.swift b/Tests/MAVSDK-SwiftTests/MissionTest.swift deleted file mode 100644 index cb11533..0000000 --- a/Tests/MAVSDK-SwiftTests/MissionTest.swift +++ /dev/null @@ -1,228 +0,0 @@ -import XCTest -import RxBlocking -import RxSwift -import RxTest -@testable import MAVSDK_Swift - -class MissionTest: XCTestCase { - - let missionResultsArary: [Mavsdk_Rpc_Mission_MissionResult.Result] = [.unknown, .error, .tooManyMissionItems, .busy, .timeout, .invalidArgument, .unsupported, .noMissionAvailable, .failedToOpenQgcPlan, .failedToParseQgcPlan, .unsupportedMissionCmd] - - func testUploadsOneItem() { - let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() - let scheduler = TestScheduler(initialClock: 0) - let mission = Mission(service: fakeService, scheduler: scheduler) - - let missionItem = Mission.MissionItem(latitudeDeg: 46, longitudeDeg: 6, relativeAltitudeM: 50, speedMS: 3.4, isFlyThrough: true, gimbalPitchDeg: 90, gimbalYawDeg: 23, cameraAction: Mission.MissionItem.CameraAction.none, loiterTimeS: 2, cameraPhotoIntervalS: 1) - - _ = mission.uploadMission(missionItems: [missionItem]) - } - - func testDownloadMissionSucceedsOnSuccess() { - let expectedResult = [Mission.MissionItem(latitudeDeg: 46.0, longitudeDeg: 6.0, relativeAltitudeM: Float(50), speedMS: Float(3.4), isFlyThrough: true, gimbalPitchDeg: Float(90), gimbalYawDeg: Float(23), cameraAction: Mission.MissionItem.CameraAction.none, loiterTimeS: Float(2), cameraPhotoIntervalS: 1).rpcMissionItem] - - let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() - var response = Mavsdk_Rpc_Mission_DownloadMissionResponse() - response.missionResult.result = Mavsdk_Rpc_Mission_MissionResult.Result.success - response.missionItems = expectedResult - - fakeService.downloadMissionResponses.append(response) - - let scheduler = TestScheduler(initialClock: 0) - let client = Mission(service: fakeService, scheduler: scheduler) - - _ = client.downloadMission() - .do(onError: { error in XCTFail("\(error)") }) - .subscribe() - } - - func testStartSucceedsOnSuccess() throws { - _ = try startWithFakeResult(result: Mavsdk_Rpc_Mission_MissionResult.Result.success) - } - - func startWithFakeResult(result: Mavsdk_Rpc_Mission_MissionResult.Result) throws { - let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() - var response = Mavsdk_Rpc_Mission_StartMissionResponse() - response.missionResult.result = result - fakeService.startMissionResponses.append(response) - - let scheduler = TestScheduler(initialClock: 0) - let mission = Mission(service: fakeService, scheduler: scheduler) - - _ = mission.startMission().toBlocking().materialize() - } - - func testStartFailsOnFailure() throws { - try missionResultsArary.forEach { result in - try startWithFakeResult(result: result) - } - } - - func testPauseSucceedsOnSuccess() throws { - try pauseWithFakeResult(result: Mavsdk_Rpc_Mission_MissionResult.Result.success) - } - - func pauseWithFakeResult(result: Mavsdk_Rpc_Mission_MissionResult.Result) throws { - let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() - var response = Mavsdk_Rpc_Mission_PauseMissionResponse() - response.missionResult.result = result - fakeService.pauseMissionResponses.append(response) - - let scheduler = TestScheduler(initialClock: 0) - let mission = Mission(service: fakeService, scheduler: scheduler) - _ = mission.pauseMission() - .toBlocking() - .materialize() - - scheduler.start() - } - - func testPauseFailsOnFailure() throws { - try missionResultsArary.forEach { result in - try pauseWithFakeResult(result: result) - } - } - - func testSetReturnToLaunchAfterMissionOnSuccess() throws { - _ = try setReturnToLaunchAfterMissionWithFakeResults() - } - - func setReturnToLaunchAfterMissionWithFakeResults() throws { - let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() - let response = Mavsdk_Rpc_Mission_SetReturnToLaunchAfterMissionResponse() - fakeService.setReturnToLaunchAfterMissionResponses.append(response) - - let scheduler = TestScheduler(initialClock: 0) - let mission = Mission(service: fakeService, scheduler: scheduler) - - _ = mission.setReturnToLaunchAfterMission(enable: true).toBlocking().materialize() - } - - func testGetReturnToLaunchAfterMissionOnSuccess() { - let expectedValue = true - - let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() - var response = Mavsdk_Rpc_Mission_GetReturnToLaunchAfterMissionResponse() - response.enable = expectedValue - fakeService.getReturnToLaunchAfterMissionResponses.append(response) - - let scheduler = TestScheduler(initialClock: 0) - let mission = Mission(service: fakeService, scheduler: scheduler) - - _ = mission.getReturnToLaunchAfterMission().subscribe { event in - switch event { - case .success(let index): - XCTAssert(index == expectedValue) - break - case .error(let error): - XCTFail("Expecting success, got failure: getReturnToLaunchAfterMission() \(error)") - } - } - } - - func testSetCurrentMissionItemIndexOnSuccess() throws { - _ = try setCurrentMissionItemIndexWithFakeResults() - } - - func setCurrentMissionItemIndexWithFakeResults() throws { - let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() - let response = Mavsdk_Rpc_Mission_SetCurrentMissionItemIndexResponse() - fakeService.setCurrentMissionItemIndexResponses.append(response) - - let scheduler = TestScheduler(initialClock: 0) - let mission = Mission(service: fakeService, scheduler: scheduler) - - _ = mission.setCurrentMissionItemIndex(index: 2).toBlocking().materialize() - } - - func testIsMissionFinishedSucceedsOnSuccess() { - let expectedResult = true - let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() - var response = Mavsdk_Rpc_Mission_IsMissionFinishedResponse() - response.isFinished = expectedResult - fakeService.isMissionFinishedResponses.append(response) - - let scheduler = TestScheduler(initialClock: 0) - let mission = Mission(service: fakeService, scheduler: scheduler) - - _ = mission.isMissionFinished().subscribe { event in - switch event { - case .success(let isFinished): - XCTAssert(isFinished == expectedResult) - break - case .error(let error): - XCTFail("Expecting success, got failure: isMissionFinished() \(error) ") - } - } - } - - func testMissionProgressObservableEmitsNothingWhenNoEvent() { - let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() - let fakeCall = Mavsdk_Rpc_Mission_MissionServiceSubscribeMissionProgressCallTestStub() - fakeService.subscribeMissionProgressCalls.append(fakeCall) - - let scheduler = TestScheduler(initialClock: 0) - let mission = Mission(service: fakeService, scheduler: scheduler) - let observer = scheduler.createObserver(Mission.MissionProgress.self) - - let _ = mission.missionProgress.subscribe(observer) - scheduler.start() - - XCTAssertEqual(0, observer.events.count) - } - - func testMissionProgressObservableReceivesOneEvent() { - let missionProgress = createRPCMissionProgress(currentItemIndex: 5, missionCount: 10) - let missionProgressArray = [missionProgress] - - checkMissionProgressObservableReceivesEvents(missionProgressArray: missionProgressArray) - } - - func testMissionProgressObservableReceivesMultipleEvents() { - var missionProgressArray = [Mavsdk_Rpc_Mission_MissionProgressResponse]() - missionProgressArray.append(createRPCMissionProgress(currentItemIndex: 1, missionCount: 10)) - missionProgressArray.append(createRPCMissionProgress(currentItemIndex: 2, missionCount: 10)) - missionProgressArray.append(createRPCMissionProgress(currentItemIndex: 3, missionCount: 10)) - missionProgressArray.append(createRPCMissionProgress(currentItemIndex: 4, missionCount: 10)) - missionProgressArray.append(createRPCMissionProgress(currentItemIndex: 5, missionCount: 10)) - missionProgressArray.append(createRPCMissionProgress(currentItemIndex: 6, missionCount: 10)) - missionProgressArray.append(createRPCMissionProgress(currentItemIndex: 7, missionCount: 10)) - - checkMissionProgressObservableReceivesEvents(missionProgressArray: missionProgressArray) - } - - func checkMissionProgressObservableReceivesEvents(missionProgressArray: [Mavsdk_Rpc_Mission_MissionProgressResponse]) { - let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() - let fakeCall = Mavsdk_Rpc_Mission_MissionServiceSubscribeMissionProgressCallTestStub() - - for missionProgress in missionProgressArray { - fakeCall.outputs.append(missionProgress) - } - fakeService.subscribeMissionProgressCalls.append(fakeCall) - - let scheduler = TestScheduler(initialClock: 0) - let mission = Mission(service: fakeService, scheduler: scheduler) - let observer = scheduler.createObserver(Mission.MissionProgress.self) - - let _ = mission.missionProgress.subscribe(observer) - scheduler.start() - - var expectedEvents = [Recorded>]() - for missionProgress in missionProgressArray { - expectedEvents.append(next(0, Mission.MissionProgress.translateFromRpc(missionProgress.missionProgress))) - } - - XCTAssertEqual(expectedEvents.count, observer.events.count) - XCTAssertTrue(observer.events.elementsEqual(expectedEvents, by: { (observed, expected) in - observed.value == expected.value - })) - } - - func createRPCMissionProgress(currentItemIndex: Int32, missionCount: Int32) -> Mavsdk_Rpc_Mission_MissionProgressResponse { - var response = Mavsdk_Rpc_Mission_MissionProgressResponse() - response.missionProgress.currentItemIndex = currentItemIndex - response.missionProgress.missionCount = missionCount - - return response - } -} diff --git a/Tests/MAVSDK-SwiftTests/TelemetryTest.swift b/Tests/MAVSDK-SwiftTests/TelemetryTest.swift deleted file mode 100644 index 0c18fc9..0000000 --- a/Tests/MAVSDK-SwiftTests/TelemetryTest.swift +++ /dev/null @@ -1,160 +0,0 @@ -import RxTest -import RxSwift -import RxBlocking -import XCTest -@testable import MAVSDK_Swift - -class TelemetryTest: XCTestCase { - - func testPositionObservableEmitsNothingWhenNoEvent() { - let fakeService = Mavsdk_Rpc_Telemetry_TelemetryServiceServiceTestStub() - let fakeCall = Mavsdk_Rpc_Telemetry_TelemetryServiceSubscribePositionCallTestStub() - fakeService.subscribePositionCalls.append(fakeCall) - fakeService.subscribePositionCalls.append(fakeCall) - fakeService.subscribePositionCalls.append(fakeCall) - - let scheduler = TestScheduler(initialClock: 0) - let telemetry = Telemetry(service: fakeService, scheduler: scheduler) - let observer = scheduler.createObserver(Telemetry.Position.self) - - let _ = telemetry.position.subscribe(observer) - scheduler.start() - - XCTAssertEqual(0, observer.events.count) - } - - func testPositionObservableReceivesOneEvent() { - let position = createRPCPosition(latitudeDeg: 41.848695, longitudeDeg: 75.132751, absoluteAltitudeM: 3002.1, relativeAltitudeM: 50.3); - let positions = [position] - - checkPositionObservableReceivesEvents(positions: positions) - } - - func createRPCPosition(latitudeDeg: Double, longitudeDeg: Double, absoluteAltitudeM: Float, relativeAltitudeM: Float) -> Mavsdk_Rpc_Telemetry_Position { - var position = Mavsdk_Rpc_Telemetry_Position() - position.latitudeDeg = latitudeDeg - position.longitudeDeg = longitudeDeg - position.absoluteAltitudeM = absoluteAltitudeM - position.relativeAltitudeM = relativeAltitudeM - - return position - } - - func checkPositionObservableReceivesEvents(positions: [Mavsdk_Rpc_Telemetry_Position]) { - let fakeService = Mavsdk_Rpc_Telemetry_TelemetryServiceServiceTestStub() - let fakeCall = Mavsdk_Rpc_Telemetry_TelemetryServiceSubscribePositionCallTestStub() - - fakeCall.outputs.append(contentsOf: positions.map{ position in createPositionResponse(position: position) }) - fakeService.subscribePositionCalls.append(fakeCall) - - let scheduler = TestScheduler(initialClock: 0) - let observer = scheduler.createObserver(Telemetry.Position.self) - let telemetry = Telemetry(service: fakeService, scheduler: scheduler) - - let _ = telemetry.position.subscribe(observer) - scheduler.start() - - let expectedEvents = positions.map{ position in next(1, Telemetry.Position.translateFromRpc(position)) } - - XCTAssertEqual(expectedEvents.count, observer.events.count) - XCTAssertTrue(observer.events.elementsEqual(expectedEvents, by: { (observed, expected) in - observed.value == expected.value - })) - } - - func testPositionObservableReceivesMultipleEvents() { - var positions = [Mavsdk_Rpc_Telemetry_Position]() - positions.append(createRPCPosition(latitudeDeg: 41.848695, longitudeDeg: 75.132751, absoluteAltitudeM: 3002.1, relativeAltitudeM: 50.3)); - positions.append(createRPCPosition(latitudeDeg: 46.522626, longitudeDeg: 6.635356, absoluteAltitudeM: 542.2, relativeAltitudeM: 79.8)); - positions.append(createRPCPosition(latitudeDeg: -50.995944711358824, longitudeDeg: -72.99892046835936, absoluteAltitudeM: 1217.12, relativeAltitudeM: 2.52)); - - checkPositionObservableReceivesEvents(positions: positions) - } - - func createPositionResponse(position: Mavsdk_Rpc_Telemetry_Position) -> Mavsdk_Rpc_Telemetry_PositionResponse { - var response = Mavsdk_Rpc_Telemetry_PositionResponse() - response.position = position - - return response - } - - func testHealthObservableEmitsNothingWhenNoEvent() { - let fakeService = Mavsdk_Rpc_Telemetry_TelemetryServiceServiceTestStub() - let fakeCall = Mavsdk_Rpc_Telemetry_TelemetryServiceSubscribeHealthCallTestStub() - fakeService.subscribeHealthCalls.append(fakeCall) - - let scheduler = TestScheduler(initialClock: 0) - let telemetry = Telemetry(service: fakeService, scheduler: scheduler) - let observer = scheduler.createObserver(Telemetry.Health.self) - - let _ = telemetry.health.subscribe(observer) - scheduler.start() - - XCTAssertEqual(0, observer.events.count) - } - - func testHealthObservableReceivesOneEvent() { - checkHealthObservableReceivesEvents(nbEvents: 1) - } - - func testHealthObservableReceivesMultipleEvents() { - checkHealthObservableReceivesEvents(nbEvents: 10) - } - - func checkHealthObservableReceivesEvents(nbEvents: UInt) { - let fakeService = Mavsdk_Rpc_Telemetry_TelemetryServiceServiceTestStub() - let fakeCall = Mavsdk_Rpc_Telemetry_TelemetryServiceSubscribeHealthCallTestStub() - - var healths = [Mavsdk_Rpc_Telemetry_Health]() - for _ in 1...nbEvents { - healths.append(createRandomRPCHealth()) - } - - for health in healths { - fakeCall.outputs.append(createHealthResponse(health: health)) - } - fakeService.subscribeHealthCalls.append(fakeCall) - - let scheduler = TestScheduler(initialClock: 0) - let telemetry = Telemetry(service: fakeService, scheduler: scheduler) - let observer = scheduler.createObserver(Telemetry.Health.self) - - let _ = telemetry.health.subscribe(observer) - scheduler.start() - - var expectedEvents = [Recorded>]() - for health in healths { - expectedEvents.append(next(0, Telemetry.Health.translateFromRpc(health))) - } - - XCTAssertEqual(expectedEvents.count, observer.events.count) - XCTAssertTrue(observer.events.elementsEqual(expectedEvents, by: { (observed, expected) in - observed.value == expected.value - })) - } - - func createHealthResponse(health: Mavsdk_Rpc_Telemetry_Health) -> Mavsdk_Rpc_Telemetry_HealthResponse { - var response = Mavsdk_Rpc_Telemetry_HealthResponse() - response.health = health - - return response - } - - func generateRandomBool() -> Bool { - return arc4random_uniform(2) == 0 - } - - func createRandomRPCHealth() -> Mavsdk_Rpc_Telemetry_Health { - var health = Mavsdk_Rpc_Telemetry_Health() - - health.isGyrometerCalibrationOk = generateRandomBool() - health.isAccelerometerCalibrationOk = generateRandomBool() - health.isMagnetometerCalibrationOk = generateRandomBool() - health.isLevelCalibrationOk = generateRandomBool() - health.isLocalPositionOk = generateRandomBool() - health.isGlobalPositionOk = generateRandomBool() - health.isHomePositionOk = generateRandomBool() - - return health - } -} diff --git a/Tests/MAVSDK-SwiftIntegrationTests/ActionTest.swift b/Tests/MavsdkIntegrationTests/ActionTest.swift similarity index 98% rename from Tests/MAVSDK-SwiftIntegrationTests/ActionTest.swift rename to Tests/MavsdkIntegrationTests/ActionTest.swift index bfd08b3..e3ec871 100644 --- a/Tests/MAVSDK-SwiftIntegrationTests/ActionTest.swift +++ b/Tests/MavsdkIntegrationTests/ActionTest.swift @@ -1,6 +1,6 @@ import RxSwift import XCTest -@testable import MAVSDK_Swift +@testable import Mavsdk class ActionTest: XCTestCase { diff --git a/Tests/MAVSDK-SwiftIntegrationTests/CalibrationTest.swift b/Tests/MavsdkIntegrationTests/CalibrationTest.swift similarity index 98% rename from Tests/MAVSDK-SwiftIntegrationTests/CalibrationTest.swift rename to Tests/MavsdkIntegrationTests/CalibrationTest.swift index f7b1461..69b1b4f 100644 --- a/Tests/MAVSDK-SwiftIntegrationTests/CalibrationTest.swift +++ b/Tests/MavsdkIntegrationTests/CalibrationTest.swift @@ -1,6 +1,6 @@ import RxSwift import XCTest -@testable import MAVSDK_Swift +@testable import Mavsdk class CalibrationTest: XCTestCase { diff --git a/Tests/MAVSDK-SwiftIntegrationTests/CameraTest.swift b/Tests/MavsdkIntegrationTests/CameraTest.swift similarity index 99% rename from Tests/MAVSDK-SwiftIntegrationTests/CameraTest.swift rename to Tests/MavsdkIntegrationTests/CameraTest.swift index 20e71bb..e2f9a1d 100644 --- a/Tests/MAVSDK-SwiftIntegrationTests/CameraTest.swift +++ b/Tests/MavsdkIntegrationTests/CameraTest.swift @@ -3,7 +3,7 @@ import RxBlocking import RxSwift import RxTest import XCTest -@testable import MAVSDK_Swift +@testable import Mavsdk class CameraTest: XCTestCase { diff --git a/Tests/MAVSDK-SwiftIntegrationTests/CoreTest.swift b/Tests/MavsdkIntegrationTests/CoreTest.swift similarity index 96% rename from Tests/MAVSDK-SwiftIntegrationTests/CoreTest.swift rename to Tests/MavsdkIntegrationTests/CoreTest.swift index 0521b4e..793013d 100644 --- a/Tests/MAVSDK-SwiftIntegrationTests/CoreTest.swift +++ b/Tests/MavsdkIntegrationTests/CoreTest.swift @@ -1,6 +1,6 @@ import RxBlocking import XCTest -@testable import MAVSDK_Swift +@testable import Mavsdk class CoreTest: XCTestCase { diff --git a/Tests/MAVSDK-SwiftIntegrationTests/MissionTest.swift b/Tests/MavsdkIntegrationTests/MissionTest.swift similarity index 97% rename from Tests/MAVSDK-SwiftIntegrationTests/MissionTest.swift rename to Tests/MavsdkIntegrationTests/MissionTest.swift index 4e50276..b0fc6e8 100644 --- a/Tests/MAVSDK-SwiftIntegrationTests/MissionTest.swift +++ b/Tests/MavsdkIntegrationTests/MissionTest.swift @@ -1,6 +1,6 @@ import RxSwift import XCTest -@testable import MAVSDK_Swift +@testable import Mavsdk class MissionTest: XCTestCase { diff --git a/Tests/MAVSDK-SwiftIntegrationTests/TelemetryTest.swift b/Tests/MavsdkIntegrationTests/TelemetryTest.swift similarity index 96% rename from Tests/MAVSDK-SwiftIntegrationTests/TelemetryTest.swift rename to Tests/MavsdkIntegrationTests/TelemetryTest.swift index ee1a593..15b9e6f 100644 --- a/Tests/MAVSDK-SwiftIntegrationTests/TelemetryTest.swift +++ b/Tests/MavsdkIntegrationTests/TelemetryTest.swift @@ -2,7 +2,7 @@ import RxBlocking import RxTest import RxSwift import XCTest -@testable import MAVSDK_Swift +@testable import Mavsdk class TelemetryTest: XCTestCase { diff --git a/Tests/MavsdkTests/ActionTest.swift b/Tests/MavsdkTests/ActionTest.swift new file mode 100644 index 0000000..bcf9fe9 --- /dev/null +++ b/Tests/MavsdkTests/ActionTest.swift @@ -0,0 +1,105 @@ +//import XCTest +//import RxBlocking +//import RxSwift +//import RxTest +//@testable import Mavsdk +// +//class ActionTest: XCTestCase { +// +// let ARBITRARY_ALTITUDE: Float = 123.5 +// let ARBITRARY_SPEED: Float = 321.5 +// +// let actionResultsArray: [Mavsdk_Rpc_Action_ActionResult.Result] = [.busy, .commandDenied, .commandDeniedNotLanded, .commandDeniedLandedStateUnknown, .connectionError, .noSystem, .noVtolTransitionSupport, .timeout, .unknown, .vtolTransitionSupportUnknown] +// +// func testArmSucceedsOnSuccess() throws { +// try armWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result.success) +// } +// +// func testArmFailsOnFailure() throws { +// try actionResultsArray.forEach { result in +// try armWithFakeResult(result: result) +// } +// } +// +// func armWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result) throws { +// let fakeService = Mavsdk_Rpc_Action_ActionServiceServiceTestStub() +// var response = Mavsdk_Rpc_Action_ArmResponse() +// response.actionResult.result = result +// fakeService.armResponses.append(response) +// +// let scheduler = TestScheduler(initialClock: 0) +// let action = Action(service: fakeService, scheduler: scheduler) +// +// scheduler.start() +// _ = action.arm().toBlocking().materialize() +// } +// +// func testDisarmSucceedsOnSuccess() throws { +// try disarmWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result.success) +// } +// +// func testDisarmFailsOnFailure() throws { +// try actionResultsArray.forEach { result in +// try disarmWithFakeResult(result: result) +// } +// } +// +// func disarmWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result) throws { +// let fakeService = Mavsdk_Rpc_Action_ActionServiceServiceTestStub() +// var response = Mavsdk_Rpc_Action_DisarmResponse() +// response.actionResult.result = result +// fakeService.disarmResponses.append(response) +// +// let scheduler = TestScheduler(initialClock: 0) +// let client = Action(service: fakeService, scheduler: scheduler) +// +// scheduler.start() +// _ = client.disarm().toBlocking().materialize() +// } +// +// func testReturnToLaunchSucceedsOnSuccess() throws { +// try returnToLaunchWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result.success) +// } +// +// func testReturnToLaunchFailsOnFailure() throws { +// try actionResultsArray.forEach { result in +// try returnToLaunchWithFakeResult(result: result) +// } +// } +// +// func returnToLaunchWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result) throws { +// let fakeService = Mavsdk_Rpc_Action_ActionServiceServiceTestStub() +// var response = Mavsdk_Rpc_Action_ReturnToLaunchResponse() +// response.actionResult.result = result +// fakeService.returnToLaunchResponses.append(response) +// +// let scheduler = TestScheduler(initialClock: 0) +// let client = Action(service: fakeService, scheduler: scheduler) +// +// scheduler.start() +// _ = client.returnToLaunch().toBlocking().materialize() +// } +// +// func testTransitionToFixedWingsSucceedsOnSuccess() throws { +// try transitionToFixedWingsWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result.success) +// } +// +// func testTransitionToFixedWingsFailsOnFailure() throws { +// try actionResultsArray.forEach { result in +// try transitionToFixedWingsWithFakeResult(result: result) +// } +// } +// +// func transitionToFixedWingsWithFakeResult(result: Mavsdk_Rpc_Action_ActionResult.Result) throws { +// let fakeService = Mavsdk_Rpc_Action_ActionServiceServiceTestStub() +// var response = Mavsdk_Rpc_Action_TransitionToFixedWingResponse() +// response.actionResult.result = result +// fakeService.transitionToFixedWingResponses.append(response) +// +// let scheduler = TestScheduler(initialClock: 0) +// let client = Action(service: fakeService, scheduler: scheduler) +// +// scheduler.start() +// _ = client.transitionToFixedWing().toBlocking().materialize() +// } +//} diff --git a/Tests/MavsdkTests/CameraTest.swift b/Tests/MavsdkTests/CameraTest.swift new file mode 100644 index 0000000..efbdb8e --- /dev/null +++ b/Tests/MavsdkTests/CameraTest.swift @@ -0,0 +1,268 @@ +import Foundation +import RxBlocking +import RxSwift +import RxTest +import XCTest +@testable import Mavsdk +// +//class CameraTest: XCTestCase { +// +// let scheduler = MainScheduler.instance +// let cameraResultsArray: [Mavsdk_Rpc_Camera_CameraResult.Result] = [.unknown, .error, .busy, .timeout, .inProgress, .denied, .wrongArgument] +// +// func testTakePhoto() throws { +// _ = try takePhotoWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result.success) +// } +// +// func takePhotoWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { +// let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() +// var response = Mavsdk_Rpc_Camera_TakePhotoResponse() +// +// response.cameraResult.result = result +// fakeService.takePhotoResponses.append(response) +// +// let client = Camera(service: fakeService, scheduler: scheduler) +// +// _ = client.takePhoto().toBlocking().materialize() +// } +// +// func testTakePhotoFail() throws { +// try cameraResultsArray.forEach { result in +// try takePhotoWithFakeResult(result: result) +// } +// } +// +// func testStartPhotoInteval() throws { +// _ = try startPhotoIntervalWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result.success) +// } +// +// func startPhotoIntervalWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { +// let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() +// var response = Mavsdk_Rpc_Camera_StartPhotoIntervalResponse() +// +// response.cameraResult.result = result +// fakeService.startPhotoIntervalResponses.append(response) +// +// let client = Camera(service: fakeService, scheduler: scheduler) +// +// _ = client.startPhotoInterval(intervalS: 5).toBlocking().materialize() +// } +// +// func testStartPhotoIntervalFail() throws { +// try cameraResultsArray.forEach { result in +// try startPhotoIntervalWithFakeResult(result: result) +// } +// } +// +// func testStopPhotoInterval() throws { +// _ = try stopPhotoIntervalWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result.success) +// } +// +// func stopPhotoIntervalWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { +// let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() +// var response = Mavsdk_Rpc_Camera_StopPhotoIntervalResponse() +// +// response.cameraResult.result = result +// fakeService.stopPhotoIntervalResponses.append(response) +// +// let client = Camera(service: fakeService, scheduler: scheduler) +// +// _ = client.stopPhotoInterval().toBlocking().materialize() +// } +// +// func testStopPhotoIntervalFail() throws { +// try cameraResultsArray.forEach { result in +// try stopPhotoIntervalWithFakeResult(result: result) +// } +// } +// +// func testStartVideo() throws { +// _ = try startVideoWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result.success) +// } +// +// func startVideoWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { +// let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() +// var response = Mavsdk_Rpc_Camera_StartVideoResponse() +// +// response.cameraResult.result = result +// fakeService.startVideoResponses.append(response) +// +// let client = Camera(service: fakeService, scheduler: scheduler) +// +// _ = client.startVideo().toBlocking().materialize() +// } +// +// func testStartVideoFail() throws { +// try cameraResultsArray.forEach { result in +// try startVideoWithFakeResult(result:result) +// } +// } +// +// func testStopVideo() throws { +// _ = try stopPhotoIntervalWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result.success) +// } +// +// func stopVideoWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { +// let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() +// var response = Mavsdk_Rpc_Camera_StopVideoResponse() // Should fail? +// +// response.cameraResult.result = result +// fakeService.stopVideoResponses.append(response) +// +// let client = Camera(service: fakeService, scheduler: scheduler) +// +// _ = client.stopVideo().toBlocking().materialize() +// } +// +// func testStopVideoFail() throws { +// try cameraResultsArray.forEach { result in +// _ = try stopPhotoIntervalWithFakeResult(result: result) +// } +// } +// +// func testStartVideoStreaming() throws { +// try startVideoWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result.success) +// } +// +// func startVideoStreamingWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { +// let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() +// var response = Mavsdk_Rpc_Camera_StartVideoStreamingResponse() +// +// response.cameraResult.result = result +// fakeService.startVideoStreamingResponses.append(response) +// +// let client = Camera(service: fakeService, scheduler: scheduler) +// +// _ = client.startVideoStreaming().toBlocking().materialize() +// } +// +// func testStartVideoStreamingFail() throws { +// try cameraResultsArray.forEach { result in +// try startVideoStreamingWithFakeResult(result: result) +// } +// } +// +// func testStopVideoStreaming() throws { +// _ = try stopPhotoIntervalWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result.success) +// } +// +// func stopVideoStreamingWithFakeResult(result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { +// let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() +// var response = Mavsdk_Rpc_Camera_StopVideoStreamingResponse() +// +// response.cameraResult.result = result +// fakeService.stopVideoStreamingResponses.append(response) +// +// let client = Camera(service: fakeService, scheduler: scheduler) +// +// _ = client.stopVideoStreaming().toBlocking().materialize() +// } +// +// func testStopVideoStreamingFail() throws { +// try cameraResultsArray.forEach { result in +// try stopVideoStreamingWithFakeResult(result: result) +// } +// } +// +// func testSetMode() throws { +// let cameraModeArray: [Camera.CameraMode] = [.unknown, .photo, .video] +// +// try cameraModeArray.forEach { mode in +// try setModeWithFakeResult(mode: mode, result: Mavsdk_Rpc_Camera_CameraResult.Result.success) +// } +// } +// +// func setModeWithFakeResult(mode: Camera.CameraMode, result: Mavsdk_Rpc_Camera_CameraResult.Result) throws { +// let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() +// var response = Mavsdk_Rpc_Camera_SetModeResponse() +// +// response.cameraResult.result = result +// fakeService.setModeResponses.append(response) +// +// let client = Camera(service: fakeService, scheduler: scheduler) +// +// _ = client.setMode(cameraMode: mode).toBlocking().materialize() +// } +// +// func testSetModeFail() throws { +// let cameraModeArray: [Camera.CameraMode] = [.unknown, .photo, .video] +// +// try cameraResultsArray.forEach { result in +// try cameraModeArray.forEach { mode in +// try setModeWithFakeResult(mode: mode, result: result) +// } +// } +// } +// +// func testSubscribeModeEmitsNothingWhenNoEvents() { +// let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() +// let fakeCall = Mavsdk_Rpc_Camera_CameraServiceSubscribeModeCallTestStub() +// fakeService.subscribeModeCalls.append(fakeCall) +// +// let camera = Camera(service: fakeService, scheduler: self.scheduler) +// let scheduler = TestScheduler(initialClock: 0) +// let observer = scheduler.createObserver(Camera.CameraMode.self) +// +// let _ = camera.mode.subscribe(observer) +// scheduler.start() +// +// XCTAssertEqual(0, observer.events.count) +// } +// +// func testCameraModeObservableReceivesOneEvent() { +// let cameraMode = createRPCCameraMode(status: .photo) +// let cameraModeStates = [cameraMode] +// +// checkSubscribeModeReceivesEvents(cameraModeStates: cameraModeStates) +// } +// +// func testCameraModeObservableReceivesMultipleEvents() { +// var cameraModeStates = [Mavsdk_Rpc_Camera_CameraMode]() +// cameraModeStates.append(createRPCCameraMode(status: .photo)) +// cameraModeStates.append(createRPCCameraMode(status: .video)) +// cameraModeStates.append(createRPCCameraMode(status: .unknown)) +// +// checkSubscribeModeReceivesEvents(cameraModeStates: cameraModeStates) +// } +// +// func checkSubscribeModeReceivesEvents(cameraModeStates: [Mavsdk_Rpc_Camera_CameraMode]) { +// let fakeService = Mavsdk_Rpc_Camera_CameraServiceServiceTestStub() +// let fakeCall = Mavsdk_Rpc_Camera_CameraServiceSubscribeModeCallTestStub() +// +// cameraModeStates.forEach { +// fakeCall.outputs.append(createCameraModeResponse(cameraMode: $0)) +// } +// fakeService.subscribeModeCalls.append(fakeCall) +// +// let camera = Camera(service: fakeService, scheduler: self.scheduler) +// let scheduler = TestScheduler(initialClock: 0) +// let observer = scheduler.createObserver(Camera.CameraMode.self) +// +// let _ = camera.mode.subscribe(observer) +// scheduler.start() +// +// var expectedEvents = [Recorded>]() +// cameraModeStates.forEach { +// expectedEvents.append(next(0, Camera.CameraMode.translateFromRpc($0))) +// } +// +// XCTAssertEqual(expectedEvents.count, observer.events.count) +// XCTAssertTrue(observer.events.elementsEqual(expectedEvents, by: { (observed, expected) in +// observed.value == expected.value +// })) +// } +// +// func createCameraModeResponse(cameraMode: Mavsdk_Rpc_Camera_CameraMode) -> Mavsdk_Rpc_Camera_ModeResponse { +// var response = Mavsdk_Rpc_Camera_ModeResponse() +// response.cameraMode = cameraMode +// +// return response +// } +// +// func createRPCCameraMode(status: Mavsdk_Rpc_Camera_CameraMode) -> Mavsdk_Rpc_Camera_CameraMode { +// var cameraMode = Mavsdk_Rpc_Camera_CameraMode() +// cameraMode = status +// +// return cameraMode +// } +//} diff --git a/Tests/MavsdkTests/CoreTest.swift b/Tests/MavsdkTests/CoreTest.swift new file mode 100644 index 0000000..d488239 --- /dev/null +++ b/Tests/MavsdkTests/CoreTest.swift @@ -0,0 +1,146 @@ +//import Foundation +//import RxBlocking +//import RxSwift +//import RxTest +//import XCTest +//@testable import Mavsdk +// +//class CoreTest: XCTestCase { +// let ARBITRARY_UUID: UInt64 = 42 +// let ARBITRARY_PLUGIN_NAME: String = "action" +// let ARBITRARY_PLUGIN_ADDRESS: String = "localhost" +// let ARBITRARY_PLUGIN_PORT: Int32 = 1291 +// +// func testConnectionStateObservableEmitsNothingWhenNoEvent() { +// let fakeService = Mavsdk_Rpc_Core_CoreServiceServiceTestStub() +// let fakeCall = Mavsdk_Rpc_Core_CoreServiceSubscribeConnectionStateCallTestStub() +// fakeService.subscribeConnectionStateCalls.append(fakeCall) +// +// let scheduler = TestScheduler(initialClock: 0) +// let client = Core(service: fakeService, scheduler: scheduler) +// let observer = scheduler.createObserver(Core.ConnectionState.self) +// +// let _ = client.connectionState.subscribe(observer) +// scheduler.start() +// +// XCTAssertTrue(observer.events.isEmpty) +// } +// +// func testConnectionStateObservableReceivesOneEvent() { +// let fakeService = Mavsdk_Rpc_Core_CoreServiceServiceTestStub() +// let fakeCall = Mavsdk_Rpc_Core_CoreServiceSubscribeConnectionStateCallTestStub() +// +// let expectedConnectionState = Core.ConnectionState(uuid: ARBITRARY_UUID, isConnected: true) +// fakeCall.outputs = [createConnectionStateResponse(connectionState: expectedConnectionState)] +// fakeService.subscribeConnectionStateCalls.append(fakeCall) +// +// let scheduler = TestScheduler(initialClock: 0) +// let client = Core(service: fakeService, scheduler: scheduler) +// let observer = scheduler.createObserver(Core.ConnectionState.self) +// +// let _ = client.connectionState.subscribe(observer) +// scheduler.start() +// +// let expectedEvents = [ +// next(0, expectedConnectionState), +// ] +// +// XCTAssertEqual(expectedEvents.count, observer.events.count) +// XCTAssertTrue(observer.events.elementsEqual(expectedEvents, by: { (observed, expected) in +// observed.value == expected.value +// })) +// } +// +// func createConnectionStateResponse(connectionState: Core.ConnectionState) -> Mavsdk_Rpc_Core_ConnectionStateResponse { +// var response = Mavsdk_Rpc_Core_ConnectionStateResponse() +// response.connectionState.uuid = connectionState.uuid +// response.connectionState.isConnected = connectionState.isConnected +// +// return response +// } +// +// func testDiscoverObservableReceivesMultipleEvents() { +// let fakeService = Mavsdk_Rpc_Core_CoreServiceServiceTestStub() +// let fakeCall = Mavsdk_Rpc_Core_CoreServiceSubscribeConnectionStateCallTestStub() +// +// fakeCall.outputs = [] +// var expectedConnectionStates = [Core.ConnectionState]() +// expectedConnectionStates.append(Core.ConnectionState(uuid: 4352334, isConnected: false)) +// expectedConnectionStates.append(Core.ConnectionState(uuid: 213534, isConnected: true)) +// expectedConnectionStates.append(Core.ConnectionState(uuid: 12, isConnected: false)) +// expectedConnectionStates.append(Core.ConnectionState(uuid: 9985232, isConnected: false)) +// expectedConnectionStates.append(Core.ConnectionState(uuid: 1872358, isConnected: true)) +// +// for expectedConnectionState in expectedConnectionStates { +// fakeCall.outputs.append(createConnectionStateResponse(connectionState: expectedConnectionState)) +// } +// fakeService.subscribeConnectionStateCalls.append(fakeCall) +// +// let scheduler = TestScheduler(initialClock: 0) +// let client = Core(service: fakeService, scheduler: scheduler) +// let observer = scheduler.createObserver(Core.ConnectionState.self) +// +// let _ = client.connectionState.subscribe(observer) +// scheduler.start() +// +// XCTAssertEqual(expectedConnectionStates.count, observer.events.count) +// XCTAssertTrue(observer.events.elementsEqual(expectedConnectionStates.map({ connState in next(1, connState) }), by: { (observed, expected) in observed.value == expected.value})) +// } +// +// func testListRunningPluginsEmitsNothingWhenEmpty() { +// let fakeService = Mavsdk_Rpc_Core_CoreServiceServiceTestStub() +// fakeService.listRunningPluginsResponses.append(Mavsdk_Rpc_Core_ListRunningPluginsResponse()) +// let scheduler = TestScheduler(initialClock: 0) +// let client = Core(service: fakeService, scheduler: scheduler) +// scheduler.start() +// +// let pluginInfos = try! client.listRunningPlugins().toBlocking().single() +// +// XCTAssertTrue(pluginInfos.isEmpty) +// } +// +// func testListRunningPluginsEmitsOnePluginInfo() throws { +// let fakeService = Mavsdk_Rpc_Core_CoreServiceServiceTestStub() +// var response = Mavsdk_Rpc_Core_ListRunningPluginsResponse() +// response.pluginInfo.append(createRPCPluginInfo(name: ARBITRARY_PLUGIN_NAME, address: ARBITRARY_PLUGIN_ADDRESS, port: ARBITRARY_PLUGIN_PORT)) +// fakeService.listRunningPluginsResponses.append(response) +// let scheduler = TestScheduler(initialClock: 0) +// let client = Core(service: fakeService, scheduler: scheduler) +// let expectedPluginInfo = Core.PluginInfo.translateFromRpc(response.pluginInfo[0]) +// +// scheduler.start() +// let pluginInfos = try client.listRunningPlugins().toBlocking().single() +// +// XCTAssertEqual(1, pluginInfos.count) +// XCTAssertEqual(expectedPluginInfo, pluginInfos.first) +// } +// +// func createRPCPluginInfo(name: String, address: String, port: Int32) -> Mavsdk_Rpc_Core_PluginInfo { +// var pluginInfo = Mavsdk_Rpc_Core_PluginInfo() +// pluginInfo.name = ARBITRARY_PLUGIN_NAME +// pluginInfo.address = ARBITRARY_PLUGIN_ADDRESS +// pluginInfo.port = ARBITRARY_PLUGIN_PORT +// +// return pluginInfo +// } +// +// func testListRunningPluginsEmitsMultiplePluginInfos() throws { +// let fakeService = Mavsdk_Rpc_Core_CoreServiceServiceTestStub() +// var response = Mavsdk_Rpc_Core_ListRunningPluginsResponse() +// response.pluginInfo.append(createRPCPluginInfo(name: "name1", address: "add1", port: 1291)) +// response.pluginInfo.append(createRPCPluginInfo(name: "name2", address: "add2", port: 1492)) +// response.pluginInfo.append(createRPCPluginInfo(name: "name3", address: "add3", port: 1515)) +// fakeService.listRunningPluginsResponses.append(response) +// let scheduler = TestScheduler(initialClock: 0) +// let client = Core(service: fakeService, scheduler: scheduler) +// +// scheduler.start() +// let pluginInfos = try client.listRunningPlugins().toBlocking().single() +// +// XCTAssertEqual(pluginInfos.count, response.pluginInfo.count) +// +// for i in 0 ... pluginInfos.count - 1 { +// XCTAssertEqual(Core.PluginInfo.translateFromRpc(response.pluginInfo[i]), pluginInfos[i]) +// } +// } +//} diff --git a/Tests/MavsdkTests/MissionTest.swift b/Tests/MavsdkTests/MissionTest.swift new file mode 100644 index 0000000..c90008e --- /dev/null +++ b/Tests/MavsdkTests/MissionTest.swift @@ -0,0 +1,228 @@ +//import XCTest +//import RxBlocking +//import RxSwift +//import RxTest +//@testable import Mavsdk +// +//class MissionTest: XCTestCase { +// +// let missionResultsArary: [Mavsdk_Rpc_Mission_MissionResult.Result] = [.unknown, .error, .tooManyMissionItems, .busy, .timeout, .invalidArgument, .unsupported, .noMissionAvailable, .failedToOpenQgcPlan, .failedToParseQgcPlan, .unsupportedMissionCmd] +// +// func testUploadsOneItem() { +// let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() +// let scheduler = TestScheduler(initialClock: 0) +// let mission = Mission(service: fakeService, scheduler: scheduler) +// +// let missionItem = Mission.MissionItem(latitudeDeg: 46, longitudeDeg: 6, relativeAltitudeM: 50, speedMS: 3.4, isFlyThrough: true, gimbalPitchDeg: 90, gimbalYawDeg: 23, cameraAction: Mission.MissionItem.CameraAction.none, loiterTimeS: 2, cameraPhotoIntervalS: 1) +// +// _ = mission.uploadMission(missionItems: [missionItem]) +// } +// +// func testDownloadMissionSucceedsOnSuccess() { +// let expectedResult = [Mission.MissionItem(latitudeDeg: 46.0, longitudeDeg: 6.0, relativeAltitudeM: Float(50), speedMS: Float(3.4), isFlyThrough: true, gimbalPitchDeg: Float(90), gimbalYawDeg: Float(23), cameraAction: Mission.MissionItem.CameraAction.none, loiterTimeS: Float(2), cameraPhotoIntervalS: 1).rpcMissionItem] +// +// let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() +// var response = Mavsdk_Rpc_Mission_DownloadMissionResponse() +// response.missionResult.result = Mavsdk_Rpc_Mission_MissionResult.Result.success +// response.missionItems = expectedResult +// +// fakeService.downloadMissionResponses.append(response) +// +// let scheduler = TestScheduler(initialClock: 0) +// let client = Mission(service: fakeService, scheduler: scheduler) +// +// _ = client.downloadMission() +// .do(onError: { error in XCTFail("\(error)") }) +// .subscribe() +// } +// +// func testStartSucceedsOnSuccess() throws { +// _ = try startWithFakeResult(result: Mavsdk_Rpc_Mission_MissionResult.Result.success) +// } +// +// func startWithFakeResult(result: Mavsdk_Rpc_Mission_MissionResult.Result) throws { +// let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() +// var response = Mavsdk_Rpc_Mission_StartMissionResponse() +// response.missionResult.result = result +// fakeService.startMissionResponses.append(response) +// +// let scheduler = TestScheduler(initialClock: 0) +// let mission = Mission(service: fakeService, scheduler: scheduler) +// +// _ = mission.startMission().toBlocking().materialize() +// } +// +// func testStartFailsOnFailure() throws { +// try missionResultsArary.forEach { result in +// try startWithFakeResult(result: result) +// } +// } +// +// func testPauseSucceedsOnSuccess() throws { +// try pauseWithFakeResult(result: Mavsdk_Rpc_Mission_MissionResult.Result.success) +// } +// +// func pauseWithFakeResult(result: Mavsdk_Rpc_Mission_MissionResult.Result) throws { +// let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() +// var response = Mavsdk_Rpc_Mission_PauseMissionResponse() +// response.missionResult.result = result +// fakeService.pauseMissionResponses.append(response) +// +// let scheduler = TestScheduler(initialClock: 0) +// let mission = Mission(service: fakeService, scheduler: scheduler) +// _ = mission.pauseMission() +// .toBlocking() +// .materialize() +// +// scheduler.start() +// } +// +// func testPauseFailsOnFailure() throws { +// try missionResultsArary.forEach { result in +// try pauseWithFakeResult(result: result) +// } +// } +// +// func testSetReturnToLaunchAfterMissionOnSuccess() throws { +// _ = try setReturnToLaunchAfterMissionWithFakeResults() +// } +// +// func setReturnToLaunchAfterMissionWithFakeResults() throws { +// let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() +// let response = Mavsdk_Rpc_Mission_SetReturnToLaunchAfterMissionResponse() +// fakeService.setReturnToLaunchAfterMissionResponses.append(response) +// +// let scheduler = TestScheduler(initialClock: 0) +// let mission = Mission(service: fakeService, scheduler: scheduler) +// +// _ = mission.setReturnToLaunchAfterMission(enable: true).toBlocking().materialize() +// } +// +// func testGetReturnToLaunchAfterMissionOnSuccess() { +// let expectedValue = true +// +// let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() +// var response = Mavsdk_Rpc_Mission_GetReturnToLaunchAfterMissionResponse() +// response.enable = expectedValue +// fakeService.getReturnToLaunchAfterMissionResponses.append(response) +// +// let scheduler = TestScheduler(initialClock: 0) +// let mission = Mission(service: fakeService, scheduler: scheduler) +// +// _ = mission.getReturnToLaunchAfterMission().subscribe { event in +// switch event { +// case .success(let index): +// XCTAssert(index == expectedValue) +// break +// case .error(let error): +// XCTFail("Expecting success, got failure: getReturnToLaunchAfterMission() \(error)") +// } +// } +// } +// +// func testSetCurrentMissionItemIndexOnSuccess() throws { +// _ = try setCurrentMissionItemIndexWithFakeResults() +// } +// +// func setCurrentMissionItemIndexWithFakeResults() throws { +// let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() +// let response = Mavsdk_Rpc_Mission_SetCurrentMissionItemIndexResponse() +// fakeService.setCurrentMissionItemIndexResponses.append(response) +// +// let scheduler = TestScheduler(initialClock: 0) +// let mission = Mission(service: fakeService, scheduler: scheduler) +// +// _ = mission.setCurrentMissionItemIndex(index: 2).toBlocking().materialize() +// } +// +// func testIsMissionFinishedSucceedsOnSuccess() { +// let expectedResult = true +// let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() +// var response = Mavsdk_Rpc_Mission_IsMissionFinishedResponse() +// response.isFinished = expectedResult +// fakeService.isMissionFinishedResponses.append(response) +// +// let scheduler = TestScheduler(initialClock: 0) +// let mission = Mission(service: fakeService, scheduler: scheduler) +// +// _ = mission.isMissionFinished().subscribe { event in +// switch event { +// case .success(let isFinished): +// XCTAssert(isFinished == expectedResult) +// break +// case .error(let error): +// XCTFail("Expecting success, got failure: isMissionFinished() \(error) ") +// } +// } +// } +// +// func testMissionProgressObservableEmitsNothingWhenNoEvent() { +// let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() +// let fakeCall = Mavsdk_Rpc_Mission_MissionServiceSubscribeMissionProgressCallTestStub() +// fakeService.subscribeMissionProgressCalls.append(fakeCall) +// +// let scheduler = TestScheduler(initialClock: 0) +// let mission = Mission(service: fakeService, scheduler: scheduler) +// let observer = scheduler.createObserver(Mission.MissionProgress.self) +// +// let _ = mission.missionProgress.subscribe(observer) +// scheduler.start() +// +// XCTAssertEqual(0, observer.events.count) +// } +// +// func testMissionProgressObservableReceivesOneEvent() { +// let missionProgress = createRPCMissionProgress(currentItemIndex: 5, missionCount: 10) +// let missionProgressArray = [missionProgress] +// +// checkMissionProgressObservableReceivesEvents(missionProgressArray: missionProgressArray) +// } +// +// func testMissionProgressObservableReceivesMultipleEvents() { +// var missionProgressArray = [Mavsdk_Rpc_Mission_MissionProgressResponse]() +// missionProgressArray.append(createRPCMissionProgress(currentItemIndex: 1, missionCount: 10)) +// missionProgressArray.append(createRPCMissionProgress(currentItemIndex: 2, missionCount: 10)) +// missionProgressArray.append(createRPCMissionProgress(currentItemIndex: 3, missionCount: 10)) +// missionProgressArray.append(createRPCMissionProgress(currentItemIndex: 4, missionCount: 10)) +// missionProgressArray.append(createRPCMissionProgress(currentItemIndex: 5, missionCount: 10)) +// missionProgressArray.append(createRPCMissionProgress(currentItemIndex: 6, missionCount: 10)) +// missionProgressArray.append(createRPCMissionProgress(currentItemIndex: 7, missionCount: 10)) +// +// checkMissionProgressObservableReceivesEvents(missionProgressArray: missionProgressArray) +// } +// +// func checkMissionProgressObservableReceivesEvents(missionProgressArray: [Mavsdk_Rpc_Mission_MissionProgressResponse]) { +// let fakeService = Mavsdk_Rpc_Mission_MissionServiceServiceTestStub() +// let fakeCall = Mavsdk_Rpc_Mission_MissionServiceSubscribeMissionProgressCallTestStub() +// +// for missionProgress in missionProgressArray { +// fakeCall.outputs.append(missionProgress) +// } +// fakeService.subscribeMissionProgressCalls.append(fakeCall) +// +// let scheduler = TestScheduler(initialClock: 0) +// let mission = Mission(service: fakeService, scheduler: scheduler) +// let observer = scheduler.createObserver(Mission.MissionProgress.self) +// +// let _ = mission.missionProgress.subscribe(observer) +// scheduler.start() +// +// var expectedEvents = [Recorded>]() +// for missionProgress in missionProgressArray { +// expectedEvents.append(next(0, Mission.MissionProgress.translateFromRpc(missionProgress.missionProgress))) +// } +// +// XCTAssertEqual(expectedEvents.count, observer.events.count) +// XCTAssertTrue(observer.events.elementsEqual(expectedEvents, by: { (observed, expected) in +// observed.value == expected.value +// })) +// } +// +// func createRPCMissionProgress(currentItemIndex: Int32, missionCount: Int32) -> Mavsdk_Rpc_Mission_MissionProgressResponse { +// var response = Mavsdk_Rpc_Mission_MissionProgressResponse() +// response.missionProgress.currentItemIndex = currentItemIndex +// response.missionProgress.missionCount = missionCount +// +// return response +// } +//} diff --git a/Tests/MavsdkTests/TelemetryTest.swift b/Tests/MavsdkTests/TelemetryTest.swift new file mode 100644 index 0000000..f8db684 --- /dev/null +++ b/Tests/MavsdkTests/TelemetryTest.swift @@ -0,0 +1,197 @@ +import RxTest +import RxSwift +import RxBlocking +import XCTest +@testable import Mavsdk + +import NIO +import GRPC + +class TelemetryTest: XCTestCase { + + // MARK: Subject under test + + var sut: Telemetry! + var eventLoopGroup: MultiThreadedEventLoopGroup! + var service: Mavsdk_Rpc_Telemetry_TelemetryServiceClient! + var scheduler: TestScheduler! + + + // MARK: Test lifecycle + + override func setUpWithError() throws { + try super.setUpWithError() + self.eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1) + + let configuration = ClientConnection.Configuration( + target: .hostAndPort("0.0.0.0", 0), + eventLoopGroup: self.eventLoopGroup + ) + + let channel = ClientConnection(configuration: configuration) + self.service = Mavsdk_Rpc_Telemetry_TelemetryServiceClient(channel: channel) + self.scheduler = TestScheduler(initialClock: 0) + self.sut = Telemetry(service: service, scheduler: scheduler, eventLoopGroup: eventLoopGroup) + } + + override func tearDownWithError() throws { + self.sut = nil + try self.eventLoopGroup.syncShutdownGracefully() + try super.tearDownWithError() + } + + // MARK: Test doubles + + // MARK: Method call expectations + + // MARK: Spied methods + + // MARK: Tests + + func testPositionObservableEmitsNothingWhenNoEvent() { + // Given + let observer = scheduler.createObserver(Telemetry.Position.self) + _ = sut.position.subscribe(observer) + + // When + scheduler.start() + + // Then + XCTAssertEqual(0, observer.events.count) + } + +// func testPositionObservableReceivesOneEvent() { +// let position = createRPCPosition(latitudeDeg: 41.848695, longitudeDeg: 75.132751, absoluteAltitudeM: 3002.1, relativeAltitudeM: 50.3); +// let positions = [position] +// +// checkPositionObservableReceivesEvents(positions: positions) +// } +// +// func createRPCPosition(latitudeDeg: Double, longitudeDeg: Double, absoluteAltitudeM: Float, relativeAltitudeM: Float) -> Mavsdk_Rpc_Telemetry_Position { +// var position = Mavsdk_Rpc_Telemetry_Position() +// position.latitudeDeg = latitudeDeg +// position.longitudeDeg = longitudeDeg +// position.absoluteAltitudeM = absoluteAltitudeM +// position.relativeAltitudeM = relativeAltitudeM +// +// return position +// } +// +// func checkPositionObservableReceivesEvents(positions: [Mavsdk_Rpc_Telemetry_Position]) { +// let fakeService = Mavsdk_Rpc_Telemetry_TelemetryServiceServiceTestStub() +// let fakeCall = Mavsdk_Rpc_Telemetry_TelemetryServiceSubscribePositionCallTestStub() +// +// fakeCall.outputs.append(contentsOf: positions.map{ position in createPositionResponse(position: position) }) +// fakeService.subscribePositionCalls.append(fakeCall) +// +// let scheduler = TestScheduler(initialClock: 0) +// let observer = scheduler.createObserver(Telemetry.Position.self) +// let telemetry = Telemetry(service: fakeService, scheduler: scheduler) +// +// let _ = telemetry.position.subscribe(observer) +// scheduler.start() +// +// let expectedEvents = positions.map{ position in next(1, Telemetry.Position.translateFromRpc(position)) } +// +// XCTAssertEqual(expectedEvents.count, observer.events.count) +// XCTAssertTrue(observer.events.elementsEqual(expectedEvents, by: { (observed, expected) in +// observed.value == expected.value +// })) +// } +// +// func testPositionObservableReceivesMultipleEvents() { +// var positions = [Mavsdk_Rpc_Telemetry_Position]() +// positions.append(createRPCPosition(latitudeDeg: 41.848695, longitudeDeg: 75.132751, absoluteAltitudeM: 3002.1, relativeAltitudeM: 50.3)); +// positions.append(createRPCPosition(latitudeDeg: 46.522626, longitudeDeg: 6.635356, absoluteAltitudeM: 542.2, relativeAltitudeM: 79.8)); +// positions.append(createRPCPosition(latitudeDeg: -50.995944711358824, longitudeDeg: -72.99892046835936, absoluteAltitudeM: 1217.12, relativeAltitudeM: 2.52)); +// +// checkPositionObservableReceivesEvents(positions: positions) +// } +// +// func createPositionResponse(position: Mavsdk_Rpc_Telemetry_Position) -> Mavsdk_Rpc_Telemetry_PositionResponse { +// var response = Mavsdk_Rpc_Telemetry_PositionResponse() +// response.position = position +// +// return response +// } +// +// func testHealthObservableEmitsNothingWhenNoEvent() { +// let fakeService = Mavsdk_Rpc_Telemetry_TelemetryServiceServiceTestStub() +// let fakeCall = Mavsdk_Rpc_Telemetry_TelemetryServiceSubscribeHealthCallTestStub() +// fakeService.subscribeHealthCalls.append(fakeCall) +// +// let scheduler = TestScheduler(initialClock: 0) +// let telemetry = Telemetry(service: fakeService, scheduler: scheduler) +// let observer = scheduler.createObserver(Telemetry.Health.self) +// +// let _ = telemetry.health.subscribe(observer) +// scheduler.start() +// +// XCTAssertEqual(0, observer.events.count) +// } +// +// func testHealthObservableReceivesOneEvent() { +// checkHealthObservableReceivesEvents(nbEvents: 1) +// } +// +// func testHealthObservableReceivesMultipleEvents() { +// checkHealthObservableReceivesEvents(nbEvents: 10) +// } +// +// func checkHealthObservableReceivesEvents(nbEvents: UInt) { +// let fakeService = Mavsdk_Rpc_Telemetry_TelemetryServiceServiceTestStub() +// let fakeCall = Mavsdk_Rpc_Telemetry_TelemetryServiceSubscribeHealthCallTestStub() +// +// var healths = [Mavsdk_Rpc_Telemetry_Health]() +// for _ in 1...nbEvents { +// healths.append(createRandomRPCHealth()) +// } +// +// for health in healths { +// fakeCall.outputs.append(createHealthResponse(health: health)) +// } +// fakeService.subscribeHealthCalls.append(fakeCall) +// +// let scheduler = TestScheduler(initialClock: 0) +// let telemetry = Telemetry(service: fakeService, scheduler: scheduler) +// let observer = scheduler.createObserver(Telemetry.Health.self) +// +// let _ = telemetry.health.subscribe(observer) +// scheduler.start() +// +// var expectedEvents = [Recorded>]() +// for health in healths { +// expectedEvents.append(next(0, Telemetry.Health.translateFromRpc(health))) +// } +// +// XCTAssertEqual(expectedEvents.count, observer.events.count) +// XCTAssertTrue(observer.events.elementsEqual(expectedEvents, by: { (observed, expected) in +// observed.value == expected.value +// })) +// } +// +// func createHealthResponse(health: Mavsdk_Rpc_Telemetry_Health) -> Mavsdk_Rpc_Telemetry_HealthResponse { +// var response = Mavsdk_Rpc_Telemetry_HealthResponse() +// response.health = health +// +// return response +// } +// +// func generateRandomBool() -> Bool { +// return arc4random_uniform(2) == 0 +// } +// +// func createRandomRPCHealth() -> Mavsdk_Rpc_Telemetry_Health { +// var health = Mavsdk_Rpc_Telemetry_Health() +// +// health.isGyrometerCalibrationOk = generateRandomBool() +// health.isAccelerometerCalibrationOk = generateRandomBool() +// health.isMagnetometerCalibrationOk = generateRandomBool() +// health.isLevelCalibrationOk = generateRandomBool() +// health.isLocalPositionOk = generateRandomBool() +// health.isGlobalPositionOk = generateRandomBool() +// health.isHomePositionOk = generateRandomBool() +// +// return health +// } +}