data/method/mavlink/pymavlink/generator/swift/Tests/MAVLinkTests/CompareWithCImpTests.swift

168 lines
6.4 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// CompareWithCImpTest.swift
// MAVLink
//
// Created by Max Odnovolyk on 10/29/16.
// Copyright © 2016 Build Apps. All rights reserved.
//
import Foundation
import XCTest
import MAVLink_C
@testable import MAVLink
class CompareWithCImplementationResultsTest: XCTestCase {
func testSwiftParserImplementationDidReturnSameFloatValuesAsCImplementation() {
let data = testAttitudeData
let mavLink = MAVLink()
var attitudeMessageSwift: Attitude!
mavLink.parse(data: data, channel: 0) { message, _ in
attitudeMessageSwift = message as! Attitude
}
XCTAssert(attitudeMessageSwift != nil, "Expects to receive valid Attitude message from provided data")
var messageC = mavlink_message_t()
var statusC = mavlink_status_t()
var attitudeMessageC = mavlink_attitude_t()
data.forEach { mavlink_parse_char(0, $0, &messageC, &statusC) }
mavlink_msg_attitude_decode(&messageC, &attitudeMessageC)
XCTAssert(attitudeMessageSwift.timeBootMs == attitudeMessageC.time_boot_ms)
XCTAssert(attitudeMessageSwift.roll == attitudeMessageC.roll)
XCTAssert(attitudeMessageSwift.pitch == attitudeMessageC.pitch)
XCTAssert(attitudeMessageSwift.yaw == attitudeMessageC.yaw)
XCTAssert(attitudeMessageSwift.rollspeed == attitudeMessageC.rollspeed)
XCTAssert(attitudeMessageSwift.pitchspeed == attitudeMessageC.pitchspeed)
XCTAssert(attitudeMessageSwift.yawspeed == attitudeMessageC.yawspeed)
}
/// Test MAVLink parser on the real world data and compare results with C code results
/// on the same data set. This test could take significant amount of time (tlog
/// contains about 163000 messages).
/// You can disable this test in test scheme configuration to save time.
/// Tlog file was downloaded from https://github.com/dronekit/dronekit-la-testdata.
/// APM:Copter V3.4-dev (bdddfae5)
func testSwiftParserImplementationDidReturnSameNumberOfMessagesAsCImplementation() {
// Load data from test tlog file
let data = testTlogData
// Message and error counters
var messageCountSwift = 0
var messageCountC = 0
var errors: [String: Int] = [:]
// Delegated messages handler
let delegate = Delegate(didParse: { _, _, _, _ in
messageCountSwift += 1
}, didFailToParseMessage: { _, error, _, _ in
// Сonsidering ParseError.valueSizeOutOfBounds, ParseError.invalidStringEncoding,
// ParseEnumError.unknownValue which are not handled in C implementation.
if let count = errors[error.description] {
errors[error.description] = count + 1
} else {
errors[error.description] = 1
}
})
// Parse data with MAVLink class instance (pure Swift implementation)
let mavLink = MAVLink()
mavLink.delegate = delegate
mavLink.parse(data: data, channel: 0)
let typesErrorCountSwift = errors.reduce(0) { result, item in result + item.1 }
// Process data with C mavlink_parse_char function
var message = mavlink_message_t()
var status = mavlink_status_t()
data.forEach { byte in
if mavlink_parse_char(0, byte, &message, &status) == UInt8(MAVLINK_FRAMING_OK.rawValue) {
messageCountC += 1
}
}
// Compare results
XCTAssert(messageCountSwift == messageCountC - typesErrorCountSwift, "Number of messages parsed in MAVLink instance should match messageCountC minus number of errors which is not handled in C code")
}
/// Test that generated by MAVLink data can be parsed in C implementation.
/// Tlog file was downloaded from https://github.com/dronekit/dronekit-la-testdata.
/// APM:Copter V3.4-dev (bdddfae5)
func testCImplementationDidParseSwiftMAVLinkOutput() {
continueAfterFailure = false
// Load data from test tlog file
let data = testTlogData
var messagesCount = 0
// Delegated messages handler
let delegate = Delegate(didParse: { message, packet, _, link in
let data = try! packet.finalize(sequence: 0)
var message = mavlink_message_t()
var status = mavlink_status_t()
var result = UInt8(MAVLINK_FRAMING_INCOMPLETE.rawValue)
data.forEach { byte in
result = mavlink_parse_char(0, byte, &message, &status)
}
XCTAssert(result == UInt8(MAVLINK_FRAMING_OK.rawValue), "C Implementation should be able to parse finalized by MAVLink message if they both use the same definitions and settings")
messagesCount += 1
})
// Parse data with MAVLink class instance (pure Swift implementation)
let mavLink = MAVLink()
mavLink.delegate = delegate
mavLink.parse(data: data, channel: 0)
XCTAssert(messagesCount > 0, "Unable to parse any method from test data")
}
func testCImplementationDidParseMessageThatStartsRightAfterCorruptedMessageIdByte() {
let unknownMessageId = UInt8(0xC7)
var data = Data(testHeartbeatData.prefix(upTo: 5))
data.append(unknownMessageId)
data.append(testStatustextData)
var message = mavlink_message_t()
var status = mavlink_status_t()
var result = UInt8(MAVLINK_FRAMING_INCOMPLETE.rawValue)
data.forEach { byte in
result = mavlink_parse_char(0, byte, &message, &status)
}
XCTAssert(result == UInt8(MAVLINK_FRAMING_OK.rawValue))
}
func testCImplementationDidParseMessageThatStartsRightAfterCorruptedCRCByte() {
let corruptedByte = UInt8(0x00)
var data = testHeartbeatData
data.removeLast(2)
data.append(corruptedByte)
data.append(testStatustextData)
var message = mavlink_message_t()
var status = mavlink_status_t()
var result = UInt8(MAVLINK_FRAMING_INCOMPLETE.rawValue)
data.forEach { byte in
result = mavlink_parse_char(0, byte, &message, &status)
}
XCTAssert(result == UInt8(MAVLINK_FRAMING_OK.rawValue))
}
}