Use this guide before merging changes to metadata, parsing, formatting, geocoding, short-number behavior, or public APIs.
The Swift package includes both the stable Objective-C targets and the Swift-first facade target, so swift test is the baseline check for Swift and Objective-C package users.
Run the Swift Package Manager test suite:
swift testRun it with a non-English locale to catch locale-sensitive assumptions:
LC_ALL=ko_KR.UTF-8 LANG=ko_KR.UTF-8 swift testRun a release build:
swift build -c releaseCheck whitespace before committing:
git diff --checkRun the upstream test parity check:
swift scripts/checkUpstreamTestParity.swiftRun the upstream API parity check:
swift scripts/checkUpstreamAPIParity.swiftWhen validating a specific Google libphonenumber version or commit, pin the ref:
swift scripts/checkUpstreamTestParity.swift --upstream-ref <version-or-commit>
swift scripts/checkUpstreamAPIParity.swift --upstream-ref <version-or-commit>See docs/UPSTREAM_PARITY.md for the full parity workflow.
Run the three main schemes on an iOS Simulator:
xcodebuild test -scheme libPhoneNumber -destination 'platform=iOS Simulator,name=iPhone 16'
xcodebuild test -scheme libPhoneNumberGeocoding -destination 'platform=iOS Simulator,name=iPhone 16'
xcodebuild test -scheme libPhoneNumberShortNumber -destination 'platform=iOS Simulator,name=iPhone 16'If the destination name is ambiguous or unavailable, list destinations and use a simulator UDID:
xcodebuild -scheme libPhoneNumber -showdestinations
xcodebuild test -scheme libPhoneNumber -destination 'id=<simulator-udid>'Using a fresh -derivedDataPath is useful when code coverage files or stale derived data create noisy warnings:
xcodebuild test -scheme libPhoneNumberShortNumber \
-destination 'id=<simulator-udid>' \
-derivedDataPath /tmp/libphone-xc-shortnumber-ddFor a small implementation or test-only change:
swift testswift build -c releasegit diff --check
For metadata updates:
swift scripts/checkUpstreamTestParity.swift --upstream-ref <metadata-ref>swift scripts/checkUpstreamAPIParity.swift --upstream-ref <metadata-ref>swift testLC_ALL=ko_KR.UTF-8 LANG=ko_KR.UTF-8 swift testswift build -c release- all three Xcode schemes
git diff --check
For public API or parser/formatter behavior changes:
swift scripts/checkUpstreamTestParity.swiftswift scripts/checkUpstreamAPIParity.swiftswift testLC_ALL=ko_KR.UTF-8 LANG=ko_KR.UTF-8 swift testswift build -c release- affected Xcode schemes, usually
libPhoneNumber git diff --check
For geocoding behavior changes:
swift testLC_ALL=ko_KR.UTF-8 LANG=ko_KR.UTF-8 swift testxcodebuild test -scheme libPhoneNumberGeocoding -destination 'id=<simulator-udid>'git diff --check
For short-number behavior changes:
swift testxcodebuild test -scheme libPhoneNumberShortNumber -destination 'id=<simulator-udid>'git diff --check
For Swift facade changes:
swift testLC_ALL=ko_KR.UTF-8 LANG=ko_KR.UTF-8 swift testswift build -c releasepod lib lint libPhoneNumberSwift.podspec --allow-warnings --include-podspecs='*.podspec'- Confirm the facade remains a thin wrapper over the Objective-C core instead of duplicating phone-number logic.
Do not assert user-preferred localized strings from convenience APIs unless the test controls locale. Prefer APIs that accept explicit language and region parameters when asserting exact geocoder descriptions.
At minimum, run:
LC_ALL=ko_KR.UTF-8 LANG=ko_KR.UTF-8 swift testThis catches tests that only pass on machines configured for English.
When porting an upstream JS test:
- Keep the local test name close to the upstream
test...function name. - Add the test to the matching XCTest file:
NBPhoneNumberUtilTest.mNBAsYouTypeFormatterTest.mNBShortNumberInfoTest.m
- Assert concrete behavior, not only that a call does not crash.
- If the ObjC behavior differs intentionally, document the reason in the test comment and PR.
- Re-run
swift scripts/checkUpstreamTestParity.swift. - Re-run
swift scripts/checkUpstreamAPIParity.swiftif the upstream public API surface changed.
Some Xcode test runs may print coverage or SQLite diagnostic messages even when tests pass. Treat them as warnings only after confirming:
xcodebuildexits with status0.- The output ends with
** TEST SUCCEEDED **. - The affected XCTest suite reports
0 failures.
If warnings are caused by reused derived data, rerun with a fresh -derivedDataPath.