~/Projects/mqtt-ios
git clone https://code.lsong.org/mqtt-ios
Commit
- Commit
- 6effb7d43cd25245ed88c21a757c71523c3d1798
- Author
- Philipp Arndt <[email protected]>
- Date
- 2020-03-06 15:37:43 +0100 +0100
- Diffstat
src/MQTTAnalyzer.xcodeproj/project.pbxproj | 16 src/MQTTAnalyzer.xcodeproj/xcshareddata/xcschemes/MQTTAnalyzer.xcscheme | 16 src/MQTTAnalyzer/extensions/StringUtils.swift | 4 src/MQTTAnalyzer/model/timeseries/DiagramPath.swift | 40 src/MQTTAnalyzer/model/timeseries/TimeSeriesModel.swift | 58 src/MQTTAnalyzer/model/timeseries/TimeSeriesValue.swift | 32 src/MQTTAnalyzerTests/DiagramPathTests.swift | 45
Merge pull request #32 from philipparndt/issue-31 https://github.com/philipparndt/mqtt-analyzer/issues/31
diff --git a/src/MQTTAnalyzer/extensions/StringUtils.swift b/src/MQTTAnalyzer/extensions/StringUtils.swift index 738247d93d4e6a40e05b5e57bbd1a44638871be9..8902853a2408b891324f55aaced6bc3a1780d8eb 100644 --- a/src/MQTTAnalyzer/extensions/StringUtils.swift +++ b/src/MQTTAnalyzer/extensions/StringUtils.swift @@ -20,8 +20,8 @@ func truncate(length: Int, trailing: String = "…") -> String { return (self.count > length) ? self.prefix(length) + trailing : self } - func pathUp() -> String { + func pathUp(_ separator: String = "/") -> String { - if let range = self.range(of: "/", options: .backwards ) { + if let range = self.range(of: separator, options: .backwards ) { if range.lowerBound.utf16Offset(in: self) == 0 { return self } diff --git a/src/MQTTAnalyzer/model/timeseries/DiagramPath.swift b/src/MQTTAnalyzer/model/timeseries/DiagramPath.swift new file mode 100644 index 0000000000000000000000000000000000000000..3e1f435935c6f0e78fee89205bd7505635ae971b --- /dev/null +++ b/src/MQTTAnalyzer/model/timeseries/DiagramPath.swift @@ -0,0 +1,40 @@ +// +// DiagramPath.swift +// MQTTAnalyzer +// +// Created by Philipp Arndt on 2020-03-06. +// Copyright © 2020 Philipp Arndt. All rights reserved. +// + +import Foundation + +class DiagramPath: Hashable, Identifiable { + let path: String + var lastSegment: String { + if let idx = path.lastIndex(of: ".") { + let start = path.index(after: idx) + return String(path[start...]) + } + return path + } + + var parentPath: String { + return path.pathUp(".") + } + + var hasSubpath: Bool { + return path.contains(".") + } + + init(_ path: String) { + self.path = path + } + + static func == (lhs: DiagramPath, rhs: DiagramPath) -> Bool { + return lhs.path == rhs.path + } + + func hash(into hasher: inout Hasher) { + hasher.combine(path) + } +} diff --git a/src/MQTTAnalyzer/model/timeseries/TimeSeriesModel.swift b/src/MQTTAnalyzer/model/timeseries/TimeSeriesModel.swift index 6ef89abf7d2691bf022207eaf19653411bb2f854..3c8bf9366effff8c8faa7ce41f65deb71e3767df 100644 --- a/src/MQTTAnalyzer/model/timeseries/TimeSeriesModel.swift +++ b/src/MQTTAnalyzer/model/timeseries/TimeSeriesModel.swift @@ -17,64 +17,6 @@ struct MTimeSeriesMeanValue { let meanValue: Int? } -class TimeSeriesValue: Hashable, Identifiable { - let value: AnyHashable - let valueString: String - - let date: Date - let dateString: String - - init(value: AnyHashable, at date: Date, dateFormatted: String) { - self.value = value - self.valueString = TimeSeriesValueUtil.createStringValue(value: value) - self.date = date - self.dateString = dateFormatted - } - - static func == (lhs: TimeSeriesValue, rhs: TimeSeriesValue) -> Bool { - return lhs.value == rhs.value - } - - func hash(into hasher: inout Hasher) { - hasher.combine(valueString) - } -} - -class DiagramPath: Hashable, Identifiable { - let path: String - var lastSegment: String { - if let idx = path.lastIndex(of: ".") { - let start = path.index(after: idx) - return String(path[start...]) - } - return path - } - - var parentPath: String { - if let idx = path.lastIndex(of: ".") { - let end = path.index(before: idx) - return String(path[...end]) - } - return "" - } - - var hasSubpath: Bool { - return path.contains(".") - } - - init(_ path: String) { - self.path = path - } - - static func == (lhs: DiagramPath, rhs: DiagramPath) -> Bool { - return lhs.path == rhs.path - } - - func hash(into hasher: inout Hasher) { - hasher.combine(path) - } -} - class MTimeSeriesModel { var values: [MTimeSeriesValue] = [] } diff --git a/src/MQTTAnalyzer/model/timeseries/TimeSeriesValue.swift b/src/MQTTAnalyzer/model/timeseries/TimeSeriesValue.swift new file mode 100644 index 0000000000000000000000000000000000000000..2a1280cbe0c5fc3ec024d56fa729077ffc7ae8ab --- /dev/null +++ b/src/MQTTAnalyzer/model/timeseries/TimeSeriesValue.swift @@ -0,0 +1,32 @@ +// +// TimeSeriesValue.swift +// MQTTAnalyzer +// +// Created by Philipp Arndt on 2020-03-06. +// Copyright © 2020 Philipp Arndt. All rights reserved. +// + +import Foundation + +class TimeSeriesValue: Hashable, Identifiable { + let value: AnyHashable + let valueString: String + + let date: Date + let dateString: String + + init(value: AnyHashable, at date: Date, dateFormatted: String) { + self.value = value + self.valueString = TimeSeriesValueUtil.createStringValue(value: value) + self.date = date + self.dateString = dateFormatted + } + + static func == (lhs: TimeSeriesValue, rhs: TimeSeriesValue) -> Bool { + return lhs.value == rhs.value + } + + func hash(into hasher: inout Hasher) { + hasher.combine(valueString) + } +} diff --git a/src/MQTTAnalyzer.xcodeproj/project.pbxproj b/src/MQTTAnalyzer.xcodeproj/project.pbxproj index b86e2b1b3e4746067cb8088943acf4b934830ddd..6afad0914193096abc4895a0e2b22235644c61a5 100644 --- a/src/MQTTAnalyzer.xcodeproj/project.pbxproj +++ b/src/MQTTAnalyzer.xcodeproj/project.pbxproj @@ -44,6 +44,9 @@ 22A386FD2409440F00DF8F94 /* InfoBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A386FC2409440F00DF8F94 /* InfoBox.swift */; }; 22A387052409768100DF8F94 /* HostModelPersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A387042409768100DF8F94 /* HostModelPersistenceTests.swift */; }; 22A38707240BD9E600DF8F94 /* TimeSeriesValueUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A38706240BD9E600DF8F94 /* TimeSeriesValueUtil.swift */; }; 22A38709240BE7D100DF8F94 /* MQTTCertificateFiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A38708240BE7D100DF8F94 /* MQTTCertificateFiles.swift */; }; + 22AE64342412636300C2C4FE /* DiagramPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22AE64332412636300C2C4FE /* DiagramPath.swift */; }; + 22AE64362412637A00C2C4FE /* TimeSeriesValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22AE64352412637A00C2C4FE /* TimeSeriesValue.swift */; }; + 22AE643824126A7500C2C4FE /* DiagramPathTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22AE643724126A7500C2C4FE /* DiagramPathTests.swift */; }; 22AF3AE72388858B001D9F87 /* NewHostFormModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22AF3AE62388858B001D9F87 /* NewHostFormModalView.swift */; }; 22AF3AE9238885AF001D9F87 /* EditHostFormModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22AF3AE8238885AF001D9F87 /* EditHostFormModalView.swift */; }; 22AF3AEB23891267001D9F87 /* HostSettingExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22AF3AEA23891267001D9F87 /* HostSettingExamples.swift */; }; @@ -152,6 +155,9 @@ 22A386FC2409440F00DF8F94 /* InfoBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoBox.swift; sourceTree = ""; }; 22A387042409768100DF8F94 /* HostModelPersistenceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HostModelPersistenceTests.swift; sourceTree = "<group>"; }; 22A38706240BD9E600DF8F94 /* TimeSeriesValueUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeSeriesValueUtil.swift; sourceTree = "<group>"; }; 22A38708240BE7D100DF8F94 /* MQTTCertificateFiles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MQTTCertificateFiles.swift; sourceTree = "<group>"; }; + 22AE64332412636300C2C4FE /* DiagramPath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiagramPath.swift; sourceTree = "<group>"; }; + 22AE64352412637A00C2C4FE /* TimeSeriesValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeSeriesValue.swift; sourceTree = "<group>"; }; + 22AE643724126A7500C2C4FE /* DiagramPathTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiagramPathTests.swift; sourceTree = "<group>"; }; 22AF3AE62388858B001D9F87 /* NewHostFormModalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewHostFormModalView.swift; sourceTree = "<group>"; }; 22AF3AE8238885AF001D9F87 /* EditHostFormModalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditHostFormModalView.swift; sourceTree = "<group>"; }; 22AF3AEA23891267001D9F87 /* HostSettingExamples.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HostSettingExamples.swift; sourceTree = "<group>"; }; @@ -301,6 +307,7 @@ 22D236F623FEFA970003D87F /* TopicModelTests.swift */, 22D236F823FEFBA10003D87F /* HostFormValidatorTests.swift */, 22D236FA23FF00E10003D87F /* StringUtilsTests.swift */, 22A387042409768100DF8F94 /* HostModelPersistenceTests.swift */, + 22AE643724126A7500C2C4FE /* DiagramPathTests.swift */, ); path = MQTTAnalyzerTests; sourceTree = "<group>"; @@ -411,6 +418,8 @@ isa = PBXGroup; children = ( 22E8971622CFBFED00A4B8A3 /* TimeSeriesModel.swift */, 22A38706240BD9E600DF8F94 /* TimeSeriesValueUtil.swift */, + 22AE64332412636300C2C4FE /* DiagramPath.swift */, + 22AE64352412637A00C2C4FE /* TimeSeriesValue.swift */, ); path = timeseries; sourceTree = "<group>"; @@ -809,11 +818,13 @@ 22F6057B23D4911000E6338B /* DataMigration.swift in Sources */, 228104952381779000112F24 /* TopicToolsView.swift in Sources */, 2205E5E1238A7EE2001638DF /* ButtonStyle.swift in Sources */, 22AF3AE9238885AF001D9F87 /* EditHostFormModalView.swift in Sources */, + 22AE64342412636300C2C4FE /* DiagramPath.swift in Sources */, 2281047623816FD800112F24 /* QuickFilterView.swift in Sources */, 22F8BEEC23C7871F00422BFF /* LoginDialog.swift in Sources */, 22A38709240BE7D100DF8F94 /* MQTTCertificateFiles.swift in Sources */, 22E469E423814CEF00D72BD6 /* JsonFormatString.swift in Sources */, 2291424C23BF78000086C251 /* AboutView.swift in Sources */, + 22AE64362412637A00C2C4FE /* TimeSeriesValue.swift in Sources */, 22C9F73723B79A1300892C4B /* MessageTextView.swift in Sources */, 22E469DB23801CA000D72BD6 /* ArrayUtils.swift in Sources */, 2291424923BF6ECE0086C251 /* KeyboardResponsiveModifier.swift in Sources */, @@ -831,6 +842,7 @@ 22D236F323FEF86E0003D87F /* MultimapTests.swift in Sources */, 22D236F523FEF9C50003D87F /* ReadstateTests.swift in Sources */, 22D236FB23FF00E10003D87F /* StringUtilsTests.swift in Sources */, 22D236F923FEFBA10003D87F /* HostFormValidatorTests.swift in Sources */, + 22AE643824126A7500C2C4FE /* DiagramPathTests.swift in Sources */, 2253F8F022C8C008007E35A2 /* MQTTAnalyzerTests.swift in Sources */, 22D236F723FEFA970003D87F /* TopicModelTests.swift in Sources */, ); @@ -992,7 +1004,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = MQTTAnalyzer/MQTTAnalyzer.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 35; + CURRENT_PROJECT_VERSION = 36; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_ASSET_PATHS = "MQTTAnalyzer/Preview\\ Content"; DEVELOPMENT_TEAM = 643R6YSRER; @@ -1017,7 +1029,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = MQTTAnalyzer/MQTTAnalyzer.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 35; + CURRENT_PROJECT_VERSION = 36; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_ASSET_PATHS = "MQTTAnalyzer/Preview\\ Content"; DEVELOPMENT_TEAM = 643R6YSRER; diff --git a/src/MQTTAnalyzer.xcodeproj/xcshareddata/xcschemes/MQTTAnalyzer.xcscheme b/src/MQTTAnalyzer.xcodeproj/xcshareddata/xcschemes/MQTTAnalyzer.xcscheme index 7ac4665b1de7500202bd817a2a68de74aef4c7b0..e79cfa5aa5af668395ab31ff1cb7a002751db058 100644 --- a/src/MQTTAnalyzer.xcodeproj/xcshareddata/xcschemes/MQTTAnalyzer.xcscheme +++ b/src/MQTTAnalyzer.xcodeproj/xcshareddata/xcschemes/MQTTAnalyzer.xcscheme @@ -27,7 +27,21 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES" + enableAddressSanitizer = "YES" + enableASanStackUseAfterReturn = "YES" codeCoverageEnabled = "YES"> + <AdditionalOptions> + <AdditionalOption + key = "NSZombieEnabled" + value = "YES" + isEnabled = "YES"> + </AdditionalOption> + <AdditionalOption + key = "MallocScribble" + value = "" + isEnabled = "YES"> + </AdditionalOption> + </AdditionalOptions> <Testables> <TestableReference skipped = "NO"> @@ -55,6 +69,8 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + enableAddressSanitizer = "YES" + enableASanStackUseAfterReturn = "YES" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/src/MQTTAnalyzerTests/DiagramPathTests.swift b/src/MQTTAnalyzerTests/DiagramPathTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..1c8eb8588f0b672d7d51138e38ea82d1247359cf --- /dev/null +++ b/src/MQTTAnalyzerTests/DiagramPathTests.swift @@ -0,0 +1,45 @@ +// +// DiagramPathTests.swift +// MQTTAnalyzerTests +// +// Created by Philipp Arndt on 2020-03-06. +// Copyright © 2020 Philipp Arndt. All rights reserved. +// + +import Foundation +import XCTest +@testable import MQTTAnalyzer + +class DiagramPathTests: XCTestCase { + + func testStandardUsecase() { + let path = DiagramPath("foo.bar") + XCTAssertEqual("bar", path.lastSegment) + XCTAssertEqual("foo", path.parentPath) + } + + func testEndWithDot() { + let path = DiagramPath("foo.bar.") + XCTAssertEqual("", path.lastSegment) + XCTAssertEqual("foo.bar", path.parentPath) + } + + func testStartEndWithDot() { + let path = DiagramPath(".foo.bar.") + XCTAssertEqual("", path.lastSegment) + XCTAssertEqual(".foo.bar", path.parentPath) + } + + func testOnlyDot() { + let path = DiagramPath(".") + XCTAssertEqual("", path.lastSegment) + XCTAssertEqual(".", path.parentPath) + } + + func testEmpty() { + let path = DiagramPath("") + XCTAssertEqual("", path.lastSegment) + XCTAssertEqual("", path.parentPath) + } + +}