diff --git a/Sources/TranslationCatalogIO/KeyHierarchy.swift b/Sources/TranslationCatalogIO/KeyHierarchy.swift
index 3c79cf8..34612c8 100644
--- a/Sources/TranslationCatalogIO/KeyHierarchy.swift
+++ b/Sources/TranslationCatalogIO/KeyHierarchy.swift
@@ -18,7 +18,7 @@ public struct KeyHierarchy {
]
static let reservedVariableTokens: [String] = [
- "any",
+// "any", // Not Necessary to reserve when used as enum case
"continue",
"for",
"in",
diff --git a/Tests/LocalizerTests/CoreDataExportTests.swift b/Tests/LocalizerTests/CoreDataExportTests.swift
deleted file mode 100644
index f1bb72c..0000000
--- a/Tests/LocalizerTests/CoreDataExportTests.swift
+++ /dev/null
@@ -1,147 +0,0 @@
-#if canImport(CoreData)
-import XCTest
-
-final class CoreDataExportTests: LocalizerTestCase {
-
- override var resource: TestResource {
- .file(
- Bundle.module.url(forResource: "test_multi_language_core_data_v3", withExtension: "sqlite")
- )
- }
-
- func testAppleStringsEnglish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "apple-strings", "en", "--storage", "core-data", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
- "APPLICATION_NAME" = "Lingua";
- "GREETING" = "Hello World!";
- "HIDDEN_MESSAGE" = "";
- "PLATFORM_ANDROID" = "Android";
- "PLATFORM_APPLE" = "Apple";
- "PLATFORM_WEB" = "Web";
-
- """)
- }
-
- func testAppleStringsSpanish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "apple-strings", "es", "--storage", "core-data", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
- "APPLICATION_NAME" = "Lingua";
- "GREETING" = "Hola Mundo!";
- "HIDDEN_MESSAGE" = "solo en español";
- "PLATFORM_ANDROID" = "Android";
- "PLATFORM_APPLE" = "Apple";
- "PLATFORM_WEB" = "Web";
-
- """)
- }
-
- func testAndroidXMLEnglish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "android-xml", "en", "--storage", "core-data", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
-
-
- Lingua
- Hello World!
-
- Android
- Apple
- Web
-
-
- """)
- }
-
- func testAndroidXMLSpanish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "android-xml", "es", "--storage", "core-data", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
-
-
- Hola Mundo!
- solo en español
-
-
- """)
- }
-
- func testAndroidXMLSpanishWithFallback() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "android-xml", "es", "--fallback", "--storage", "core-data", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
-
-
- Lingua
- Hola Mundo!
- solo en español
- Android
- Apple
- Web
-
-
- """)
- }
-
- func testJSONEnglish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "json", "en", "--storage", "core-data", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
- {
- "APPLICATION_NAME" : "Lingua",
- "GREETING" : "Hello World!",
- "HIDDEN_MESSAGE" : "",
- "PLATFORM_ANDROID" : "Android",
- "PLATFORM_APPLE" : "Apple",
- "PLATFORM_WEB" : "Web"
- }
-
- """)
- }
-
- func testJSONSpanish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "json", "es", "--storage", "core-data", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
- {
- "GREETING" : "Hola Mundo!",
- "HIDDEN_MESSAGE" : "solo en español"
- }
-
- """)
- }
-
- func testJSONSpanishWithFallback() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "json", "es", "--storage", "core-data", "--fallback", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
- {
- "APPLICATION_NAME" : "Lingua",
- "GREETING" : "Hola Mundo!",
- "HIDDEN_MESSAGE" : "solo en español",
- "PLATFORM_ANDROID" : "Android",
- "PLATFORM_APPLE" : "Apple",
- "PLATFORM_WEB" : "Web"
- }
-
- """)
- }
-}
-#endif
diff --git a/Tests/LocalizerTests/CatalogDeleteProjectTests.swift b/Tests/LocalizerTests/DeleteTests.swift
similarity index 76%
rename from Tests/LocalizerTests/CatalogDeleteProjectTests.swift
rename to Tests/LocalizerTests/DeleteTests.swift
index 179fe90..ccbafb7 100644
--- a/Tests/LocalizerTests/CatalogDeleteProjectTests.swift
+++ b/Tests/LocalizerTests/DeleteTests.swift
@@ -1,16 +1,16 @@
-import TranslationCatalogSQLite
-import XCTest
+import Foundation
+import Testing
-final class CatalogDeleteProjectTests: XCTestCase {
+struct DeleteTests {
- func testNoParameters() throws {
+ @Test func noParameters() throws {
let process = LocalizerProcess()
let (terminationStatus, _, error) = try process.runReporting(with: [
"catalog", "delete", "project",
])
- XCTAssertNotEqual(terminationStatus, 0)
- XCTAssertEqual(error, """
+ #expect(terminationStatus != 0)
+ #expect(error == """
Error: Missing expected argument ''
Help: Unique ID of the Project.
Usage: localizer catalog delete project [--storage ] [--path ] [--verbose]
@@ -21,29 +21,29 @@ final class CatalogDeleteProjectTests: XCTestCase {
try process.recycle()
}
- func testHelp() throws {
+ @Test func help() throws {
let process = LocalizerProcess()
let (terminationStatus, output, _) = try process.runReporting(with: [
"catalog", "delete", "project", "--help",
])
- XCTAssertEqual(terminationStatus, 0)
- XCTAssertTrue(output.contains("OVERVIEW: Delete a Project from the catalog."))
- XCTAssertTrue(output.contains("USAGE: localizer catalog delete project [--storage ] [--path ] [--verbose]"))
- XCTAssertTrue(output.contains("ARGUMENTS:"))
- XCTAssertTrue(output.contains("OPTIONS:"))
+ #expect(terminationStatus == 0)
+ #expect(output.contains("OVERVIEW: Delete a Project from the catalog."))
+ #expect(output.contains("USAGE: localizer catalog delete project [--storage ] [--path ] [--verbose]"))
+ #expect(output.contains("ARGUMENTS:"))
+ #expect(output.contains("OPTIONS:"))
try process.recycle()
}
- func testInvalidProjectID() throws {
+ @Test func invalidProjectID() throws {
let process = LocalizerProcess()
let (terminationStatus, _, error) = try process.runReporting(with: [
"catalog", "delete", "project", "123ABC", "--path", process.url.path(),
])
- XCTAssertNotEqual(terminationStatus, 0)
- XCTAssertEqual(error, """
+ #expect(terminationStatus != 0)
+ #expect(error == """
Error: The value '123ABC' is invalid for ''
Help: Unique ID of the Project.
Usage: localizer catalog delete project [--storage ] [--path ] [--verbose]
@@ -54,14 +54,14 @@ final class CatalogDeleteProjectTests: XCTestCase {
try process.recycle()
}
- func testUnknownProjectID() throws {
+ @Test func unknownProjectID() throws {
let process = LocalizerProcess()
let (terminationStatus, _, error) = try process.runReporting(with: [
"catalog", "delete", "project", "399150E5-6709-4CA8-AE54-C665EC3D1916", "--path", process.url.lastPathComponent,
])
- XCTAssertNotEqual(terminationStatus, 0)
- XCTAssertEqual(error, """
+ #expect(terminationStatus != 0)
+ #expect(error == """
Error: Unknown Project '399150E5-6709-4CA8-AE54-C665EC3D1916'.
Usage: project [--storage ] [--path ] [--verbose]
See 'project --help' for more information.
@@ -71,14 +71,14 @@ final class CatalogDeleteProjectTests: XCTestCase {
try process.recycle()
}
- func testUnknownProjectIDDebug() throws {
+ @Test func unknownProjectIDDebug() throws {
let process = LocalizerProcess()
let (terminationStatus, output, error) = try process.runReporting(with: [
"catalog", "delete", "project", "399150E5-6709-4CA8-AE54-C665EC3D1916", "--path", process.url.lastPathComponent, "--verbose",
])
- XCTAssertNotEqual(terminationStatus, 0)
- XCTAssertEqual(output, """
+ #expect(terminationStatus != 0)
+ #expect(output == """
======SQL======
SELECT id, uuid, name
FROM project
@@ -88,7 +88,7 @@ final class CatalogDeleteProjectTests: XCTestCase {
""")
- XCTAssertEqual(error, """
+ #expect(error == """
Error: Unknown Project '399150E5-6709-4CA8-AE54-C665EC3D1916'.
Usage: project [--storage ] [--path ] [--verbose]
See 'project --help' for more information.
@@ -98,15 +98,15 @@ final class CatalogDeleteProjectTests: XCTestCase {
try process.recycle()
}
- func testKnownProjectId() throws {
+ @Test func knownProjectIdVerbose() throws {
let resource: TestResource = .file(Bundle.module.url(forResource: "test_single_project_entity_v5", withExtension: "sqlite"))
let process = try LocalizerProcess(copying: resource)
let (terminationStatus, output, _) = try process.runReporting(with: [
"catalog", "delete", "project", "82362D51-8C80-4328-BADD-BBE2EA08889F", "--path", process.url.path(), "--verbose",
])
- XCTAssertEqual(terminationStatus, 0)
- XCTAssertEqual(output, """
+ #expect(terminationStatus == 0)
+ #expect(output == """
======SQL======
SELECT id, uuid, name
FROM project
diff --git a/Tests/LocalizerTests/ExportTests.swift b/Tests/LocalizerTests/ExportTests.swift
new file mode 100644
index 0000000..e75568e
--- /dev/null
+++ b/Tests/LocalizerTests/ExportTests.swift
@@ -0,0 +1,203 @@
+import Foundation
+@testable import localizer
+import Testing
+
+struct ExportTests {
+
+ private static var resources: [(TestResource, Catalog.Storage)] {
+ var resources: [(TestResource, Catalog.Storage)] = [
+ (
+ .file(
+ Bundle.module.url(forResource: "test_multi_language_v5", withExtension: "sqlite")
+ ),
+ .sqlite
+ ),
+ (
+ .directory(
+ Bundle.module.resourceURL?
+ .appending(path: "StructuredResources", directoryHint: .isDirectory)
+ .appending(path: "MultiLanguageCatalog", directoryHint: .isDirectory)
+ ),
+ .filesystem
+ ),
+ ]
+ #if canImport(CoreData) && os(macOS)
+ resources.append(
+ (
+ .file(
+ Bundle.module.url(forResource: "test_multi_language_core_data_v3", withExtension: "sqlite")
+ ),
+ .coreData
+ )
+ )
+ #endif
+ return resources
+ }
+
+ @Test(arguments: Self.resources)
+ func appleStringsEnglish(resource: (TestResource, Catalog.Storage)) throws {
+ let process = try LocalizerProcess(copying: resource.0)
+ let output = try process.runOutputting(with: [
+ "catalog", "export", "apple-strings", "en", "--storage", resource.1.rawValue, "--path", process.url.path(),
+ ])
+
+ #expect(output == """
+ "APPLICATION_NAME" = "Lingua";
+ "GREETING" = "Hello World!";
+ "HIDDEN_MESSAGE" = "";
+ "PLATFORM_ANDROID" = "Android";
+ "PLATFORM_APPLE" = "Apple";
+ "PLATFORM_WEB" = "Web";
+
+ """)
+
+ try process.recycle()
+ }
+
+ @Test(arguments: Self.resources)
+ func appleStringsSpanish(resource: (TestResource, Catalog.Storage)) throws {
+ let process = try LocalizerProcess(copying: resource.0)
+ let output = try process.runOutputting(with: [
+ "catalog", "export", "apple-strings", "es", "--storage", resource.1.rawValue, "--path", process.url.path(),
+ ])
+
+ #expect(output == """
+ "APPLICATION_NAME" = "Lingua";
+ "GREETING" = "Hola Mundo!";
+ "HIDDEN_MESSAGE" = "solo en español";
+ "PLATFORM_ANDROID" = "Android";
+ "PLATFORM_APPLE" = "Apple";
+ "PLATFORM_WEB" = "Web";
+
+ """)
+
+ try process.recycle()
+ }
+
+ @Test(arguments: Self.resources)
+ func androidXMLEnglish(resource: (TestResource, Catalog.Storage)) throws {
+ let process = try LocalizerProcess(copying: resource.0)
+ let output = try process.runOutputting(with: [
+ "catalog", "export", "android-xml", "en", "--storage", resource.1.rawValue, "--path", process.url.path(),
+ ])
+
+ #expect(output == """
+
+
+ Lingua
+ Hello World!
+
+ Android
+ Apple
+ Web
+
+
+ """)
+
+ try process.recycle()
+ }
+
+ @Test(arguments: Self.resources)
+ func androidXMLSpanish(resource: (TestResource, Catalog.Storage)) throws {
+ let process = try LocalizerProcess(copying: resource.0)
+ let output = try process.runOutputting(with: [
+ "catalog", "export", "android-xml", "es", "--storage", resource.1.rawValue, "--path", process.url.path(),
+ ])
+
+ #expect(output == """
+
+
+ Hola Mundo!
+ solo en español
+
+
+ """)
+
+ try process.recycle()
+ }
+
+ @Test(arguments: Self.resources)
+ func androidXMLSpanishWithFallback(resource: (TestResource, Catalog.Storage)) throws {
+ let process = try LocalizerProcess(copying: resource.0)
+ let output = try process.runOutputting(with: [
+ "catalog", "export", "android-xml", "es", "--storage", resource.1.rawValue, "--fallback", "--path", process.url.path(),
+ ])
+
+ #expect(output == """
+
+
+ Lingua
+ Hola Mundo!
+ solo en español
+ Android
+ Apple
+ Web
+
+
+ """)
+
+ try process.recycle()
+ }
+
+ @Test(arguments: Self.resources)
+ func jsonEnglish(resource: (TestResource, Catalog.Storage)) throws {
+ let process = try LocalizerProcess(copying: resource.0)
+ let output = try process.runOutputting(with: [
+ "catalog", "export", "json", "en", "--storage", resource.1.rawValue, "--path", process.url.path(),
+ ])
+
+ #expect(output == """
+ {
+ "APPLICATION_NAME" : "Lingua",
+ "GREETING" : "Hello World!",
+ "HIDDEN_MESSAGE" : "",
+ "PLATFORM_ANDROID" : "Android",
+ "PLATFORM_APPLE" : "Apple",
+ "PLATFORM_WEB" : "Web"
+ }
+
+ """)
+
+ try process.recycle()
+ }
+
+ @Test(arguments: Self.resources)
+ func jsonSpanish(resource: (TestResource, Catalog.Storage)) throws {
+ let process = try LocalizerProcess(copying: resource.0)
+ let output = try process.runOutputting(with: [
+ "catalog", "export", "json", "es", "--storage", resource.1.rawValue, "--path", process.url.path(),
+ ])
+
+ #expect(output == """
+ {
+ "GREETING" : "Hola Mundo!",
+ "HIDDEN_MESSAGE" : "solo en español"
+ }
+
+ """)
+
+ try process.recycle()
+ }
+
+ @Test(arguments: Self.resources)
+ func jsonSpanishWithFallback(resource: (TestResource, Catalog.Storage)) throws {
+ let process = try LocalizerProcess(copying: resource.0)
+ let output = try process.runOutputting(with: [
+ "catalog", "export", "json", "es", "--fallback", "--storage", resource.1.rawValue, "--path", process.url.path(),
+ ])
+
+ #expect(output == """
+ {
+ "APPLICATION_NAME" : "Lingua",
+ "GREETING" : "Hola Mundo!",
+ "HIDDEN_MESSAGE" : "solo en español",
+ "PLATFORM_ANDROID" : "Android",
+ "PLATFORM_APPLE" : "Apple",
+ "PLATFORM_WEB" : "Web"
+ }
+
+ """)
+
+ try process.recycle()
+ }
+}
diff --git a/Tests/LocalizerTests/FilesystemExportTests.swift b/Tests/LocalizerTests/FilesystemExportTests.swift
deleted file mode 100644
index 1dfec73..0000000
--- a/Tests/LocalizerTests/FilesystemExportTests.swift
+++ /dev/null
@@ -1,147 +0,0 @@
-import XCTest
-
-final class FilesystemExportTests: LocalizerTestCase {
-
- override var resource: TestResource {
- .directory(
- Bundle.module.resourceURL?
- .appending(path: "StructuredResources", directoryHint: .isDirectory)
- .appending(path: "MultiLanguageCatalog", directoryHint: .isDirectory)
- )
- }
-
- func testAppleStringsEnglish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "apple", "en", "--storage", "filesystem", "--path", directory.path(),
- ])
-
- XCTAssertEqual(output, """
- "APPLICATION_NAME" = "Lingua";
- "GREETING" = "Hello World!";
- "HIDDEN_MESSAGE" = "";
- "PLATFORM_ANDROID" = "Android";
- "PLATFORM_APPLE" = "Apple";
- "PLATFORM_WEB" = "Web";
-
- """)
- }
-
- func testAppleStringsSpanish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "apple", "es", "--storage", "filesystem", "--path", directory.path(),
- ])
-
- XCTAssertEqual(output, """
- "APPLICATION_NAME" = "Lingua";
- "GREETING" = "Hola Mundo!";
- "HIDDEN_MESSAGE" = "solo en español";
- "PLATFORM_ANDROID" = "Android";
- "PLATFORM_APPLE" = "Apple";
- "PLATFORM_WEB" = "Web";
-
- """)
- }
-
- func testAndroidXMLEnglish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "android", "en", "--storage", "filesystem", "--path", directory.path(),
- ])
-
- XCTAssertEqual(output, """
-
-
- Lingua
- Hello World!
-
- Android
- Apple
- Web
-
-
- """)
- }
-
- func testAndroidXMLSpanish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "android", "es", "--storage", "filesystem", "--path", directory.path(),
- ])
-
- XCTAssertEqual(output, """
-
-
- Hola Mundo!
- solo en español
-
-
- """)
- }
-
- func testAndroidXMLSpanishWithFallback() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "android", "es", "--fallback", "--storage", "filesystem", "--path", directory.path(),
- ])
-
- XCTAssertEqual(output, """
-
-
- Lingua
- Hola Mundo!
- solo en español
- Android
- Apple
- Web
-
-
- """)
- }
-
- func testJSONEnglish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "json", "en", "--storage", "filesystem", "--path", directory.path(),
- ])
-
- XCTAssertEqual(output, """
- {
- "APPLICATION_NAME" : "Lingua",
- "GREETING" : "Hello World!",
- "HIDDEN_MESSAGE" : "",
- "PLATFORM_ANDROID" : "Android",
- "PLATFORM_APPLE" : "Apple",
- "PLATFORM_WEB" : "Web"
- }
-
- """)
- }
-
- func testJSONSpanish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "json", "es", "--storage", "filesystem", "--path", directory.path(),
- ])
-
- XCTAssertEqual(output, """
- {
- "GREETING" : "Hola Mundo!",
- "HIDDEN_MESSAGE" : "solo en español"
- }
-
- """)
- }
-
- func testJSONSpanishWithFallback() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "json", "es", "--fallback", "--storage", "filesystem", "--path", directory.path(),
- ])
-
- XCTAssertEqual(output, """
- {
- "APPLICATION_NAME" : "Lingua",
- "GREETING" : "Hola Mundo!",
- "HIDDEN_MESSAGE" : "solo en español",
- "PLATFORM_ANDROID" : "Android",
- "PLATFORM_APPLE" : "Apple",
- "PLATFORM_WEB" : "Web"
- }
-
- """)
- }
-}
diff --git a/Tests/LocalizerTests/HelpTests.swift b/Tests/LocalizerTests/HelpTests.swift
index d9e888b..46f0791 100644
--- a/Tests/LocalizerTests/HelpTests.swift
+++ b/Tests/LocalizerTests/HelpTests.swift
@@ -1,12 +1,12 @@
-import XCTest
+import Testing
-final class HelpTests: XCTestCase {
+struct HelpTests {
- func testNoArguments() throws {
+ @Test func noArguments() throws {
let process = LocalizerProcess()
let output = try process.runOutputting()
- XCTAssertEqual(output, """
+ #expect(output == """
OVERVIEW: Utility for interacting with Android 'strings.xml', Apple
'Localizable.strings', and Web '*.json' localization files.
diff --git a/Tests/LocalizerTests/FilesystemImportTests.swift b/Tests/LocalizerTests/ImportTests.swift
similarity index 90%
rename from Tests/LocalizerTests/FilesystemImportTests.swift
rename to Tests/LocalizerTests/ImportTests.swift
index dabe2fa..a059f7b 100644
--- a/Tests/LocalizerTests/FilesystemImportTests.swift
+++ b/Tests/LocalizerTests/ImportTests.swift
@@ -1,9 +1,10 @@
-import XCTest
+import Foundation
+import Testing
-final class FilesystemImportTests: XCTestCase {
+struct ImportTests {
/// Assert that repeated imports of the same file produce the expected results
- func testDoubleImport() throws {
+ @Test func doubleImport() throws {
let resource: TestResource = .file(
Bundle.module.url(forResource: "Import1", withExtension: "strings")
)
@@ -12,7 +13,7 @@ final class FilesystemImportTests: XCTestCase {
"catalog", "import", "en", process.url.path(), "--format", "apple", "--storage", "filesystem", "--path", process.directory.path(),
])
- XCTAssertEqual(output, """
+ #expect(output == """
Expression Created 'FIRST_NAME'
Expression Created 'LAST_NAME'
Expression Created 'TITLE'
@@ -27,7 +28,7 @@ final class FilesystemImportTests: XCTestCase {
"catalog", "import", "en", process.url.path(), "--format", "apple", "--storage", "filesystem", "--path", process.directory.path(),
])
- XCTAssertEqual(output, """
+ #expect(output == """
Expression Exists with Key \'FIRST_NAME\'
Expression Exists with Key \'LAST_NAME\'
Expression Exists with Key \'TITLE\'
@@ -38,7 +39,7 @@ final class FilesystemImportTests: XCTestCase {
}
/// Assert that repeated imports of the same file (that has changes) produce the expected results
- func testRepeatImport() throws {
+ @Test func repeatImport() throws {
var resource: TestResource = .file(
Bundle.module.url(forResource: "Import1", withExtension: "strings")
)
@@ -47,7 +48,7 @@ final class FilesystemImportTests: XCTestCase {
"catalog", "import", "en", process.url.path(), "--format", "apple", "--storage", "filesystem", "--path", process.directory.path(),
])
- XCTAssertEqual(output, """
+ #expect(output == """
Expression Created 'FIRST_NAME'
Expression Created 'LAST_NAME'
Expression Created 'TITLE'
@@ -65,7 +66,7 @@ final class FilesystemImportTests: XCTestCase {
"catalog", "import", "en", process.url.path(), "--format", "apple", "--storage", "filesystem", "--path", process.directory.path(),
])
- XCTAssertEqual(output, """
+ #expect(output == """
Expression Created 'FAMILY_NAME'
Expression Created 'GIVEN_NAME'
Expression Exists with Key 'TITLE'
diff --git a/Tests/LocalizerTests/Models/LocalizerProcess.swift b/Tests/LocalizerTests/Models/LocalizerProcess.swift
index c6eee4d..9cb5a1d 100644
--- a/Tests/LocalizerTests/Models/LocalizerProcess.swift
+++ b/Tests/LocalizerTests/Models/LocalizerProcess.swift
@@ -41,7 +41,7 @@ class LocalizerProcess {
/// Returns path to the built products directory.
private var productsDirectory: URL {
#if os(macOS)
- for bundle in Bundle.allBundles where bundle.bundlePath.hasSuffix(".xctest") {
+ for bundle in Bundle.allBundles where bundle.bundlePath.contains("LocalizerTests") {
return bundle.bundleURL.deletingLastPathComponent()
}
fatalError("couldn't find the products directory")
diff --git a/Tests/LocalizerTests/PreviewTests.swift b/Tests/LocalizerTests/PreviewTests.swift
index 40b4074..be5ad1d 100644
--- a/Tests/LocalizerTests/PreviewTests.swift
+++ b/Tests/LocalizerTests/PreviewTests.swift
@@ -1,15 +1,16 @@
-import XCTest
+import Foundation
+import Testing
-final class LocalizerPreviewTests: XCTestCase {
+struct LocalizerPreviewTests {
- func testPreviewAndroid() throws {
+ @Test func previewAndroidXML() throws {
let resource: TestResource = .file(Bundle.module.url(forResource: "Strings", withExtension: "xml"))
let process = try LocalizerProcess(copying: resource)
let output = try process.runOutputting(with: [
"preview", "android", process.url.path(),
])
- XCTAssertEqual(output, """
+ #expect(output == """
APP_NAME = Localizer
NAVIGATION_TITLE = Welcome
PERFORM_ACTION = Make It Go!
@@ -19,14 +20,14 @@ final class LocalizerPreviewTests: XCTestCase {
try process.recycle()
}
- func testPreviewApple() throws {
+ @Test func previewAppleStrings() throws {
let resource: TestResource = .file(Bundle.module.url(forResource: "Localizable", withExtension: "strings"))
let process = try LocalizerProcess(copying: resource)
let output = try process.runOutputting(with: [
"preview", "apple-strings", process.url.path(),
])
- XCTAssertEqual(output, """
+ #expect(output == """
APP_NAME = Localizer
NAVIGATION_TITLE = Welcome
PERFORM_ACTION = Make It Go!
diff --git a/Tests/LocalizerTests/SQLiteExportTests.swift b/Tests/LocalizerTests/SQLiteExportTests.swift
deleted file mode 100644
index 48bd9d4..0000000
--- a/Tests/LocalizerTests/SQLiteExportTests.swift
+++ /dev/null
@@ -1,145 +0,0 @@
-import XCTest
-
-final class SQLiteExportTests: LocalizerTestCase {
-
- override var resource: TestResource {
- .file(
- Bundle.module.url(forResource: "test_multi_language_v5", withExtension: "sqlite")
- )
- }
-
- func testAppleStringsEnglish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "apple-strings", "en", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
- "APPLICATION_NAME" = "Lingua";
- "GREETING" = "Hello World!";
- "HIDDEN_MESSAGE" = "";
- "PLATFORM_ANDROID" = "Android";
- "PLATFORM_APPLE" = "Apple";
- "PLATFORM_WEB" = "Web";
-
- """)
- }
-
- func testAppleStringsSpanish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "apple-strings", "es", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
- "APPLICATION_NAME" = "Lingua";
- "GREETING" = "Hola Mundo!";
- "HIDDEN_MESSAGE" = "solo en español";
- "PLATFORM_ANDROID" = "Android";
- "PLATFORM_APPLE" = "Apple";
- "PLATFORM_WEB" = "Web";
-
- """)
- }
-
- func testAndroidXMLEnglish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "android-xml", "en", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
-
-
- Lingua
- Hello World!
-
- Android
- Apple
- Web
-
-
- """)
- }
-
- func testAndroidXMLSpanish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "android-xml", "es", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
-
-
- Hola Mundo!
- solo en español
-
-
- """)
- }
-
- func testAndroidXMLSpanishWithFallback() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "android-xml", "es", "--fallback", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
-
-
- Lingua
- Hola Mundo!
- solo en español
- Android
- Apple
- Web
-
-
- """)
- }
-
- func testJSONEnglish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "json", "en", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
- {
- "APPLICATION_NAME" : "Lingua",
- "GREETING" : "Hello World!",
- "HIDDEN_MESSAGE" : "",
- "PLATFORM_ANDROID" : "Android",
- "PLATFORM_APPLE" : "Apple",
- "PLATFORM_WEB" : "Web"
- }
-
- """)
- }
-
- func testJSONSpanish() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "json", "es", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
- {
- "GREETING" : "Hola Mundo!",
- "HIDDEN_MESSAGE" : "solo en español"
- }
-
- """)
- }
-
- func testJSONSpanishWithFallback() throws {
- let output = try process.runOutputting(with: [
- "catalog", "export", "json", "es", "--fallback", "--path", url.path(),
- ])
-
- XCTAssertEqual(output, """
- {
- "APPLICATION_NAME" : "Lingua",
- "GREETING" : "Hola Mundo!",
- "HIDDEN_MESSAGE" : "solo en español",
- "PLATFORM_ANDROID" : "Android",
- "PLATFORM_APPLE" : "Apple",
- "PLATFORM_WEB" : "Web"
- }
-
- """)
- }
-}
diff --git a/Tests/LocalizerTests/CatalogSyntaxTests.swift b/Tests/LocalizerTests/SyntaxTests.swift
similarity index 84%
rename from Tests/LocalizerTests/CatalogSyntaxTests.swift
rename to Tests/LocalizerTests/SyntaxTests.swift
index 096297d..d2e62fe 100644
--- a/Tests/LocalizerTests/CatalogSyntaxTests.swift
+++ b/Tests/LocalizerTests/SyntaxTests.swift
@@ -1,22 +1,20 @@
-import XCTest
+import Foundation
+import Testing
-final class CatalogSyntaxTests: LocalizerTestCase {
+struct SyntaxTests {
- override var resource: TestResource {
- .directory(
+ @Test func syntax() throws {
+ let resource: TestResource = .directory(
Bundle.module.resourceURL?
.appending(path: "StructuredResources", directoryHint: .isDirectory)
.appending(path: "MultiLanguageCatalog", directoryHint: .isDirectory)
)
- }
-
- func testSyntax() throws {
- let process = LocalizerProcess()
+ let process = try LocalizerProcess(copying: resource)
let output = try process.runOutputting(with: [
- "catalog", "syntax", "--storage", "filesystem", "--path", directory.path(),
+ "catalog", "syntax", "--storage", "filesystem", "--path", process.directory.path(),
])
- XCTAssertEqual(output, """
+ #expect(output == """
import LocaleSupport
enum LocalizedStrings: String, LocalizedStringConvertible {
@@ -56,5 +54,7 @@ final class CatalogSyntaxTests: LocalizerTestCase {
}
""")
+
+ try process.recycle()
}
}
diff --git a/Tests/LocalizerTests/TestCases/LocalizerTestCase.swift b/Tests/LocalizerTests/TestCases/LocalizerTestCase.swift
deleted file mode 100644
index 1a71c3b..0000000
--- a/Tests/LocalizerTests/TestCases/LocalizerTestCase.swift
+++ /dev/null
@@ -1,22 +0,0 @@
-import XCTest
-
-class LocalizerTestCase: XCTestCase {
-
- var process: LocalizerProcess!
- var resource: TestResource { .file(nil) }
-
- var url: URL { process.url }
- var directory: URL { process.directory }
-
- override func setUpWithError() throws {
- try super.setUpWithError()
- process = try LocalizerProcess(copying: resource)
- }
-
- override func tearDownWithError() throws {
- if process != nil {
- try process.recycle()
- }
- try super.tearDownWithError()
- }
-}