# SPDX-FileCopyrightText: © 2026 Jeffrey C. Ollie # SPDX-License-Identifier: MIT import pathlib import unittest from wingetsource.normalize import normalize_name, normalize_publisher DATA = pathlib.Path(__file__).parent / "data" / "winget-cli" def _lines(name: str) -> list[str]: return (DATA / name).read_text(encoding="utf-8").split("\n") class WingetTestData(unittest.TestCase): """winget-cli's own `NameNorm_Database_Initial` test, with its data: every name and publisher pair has to normalize to exactly the identifier winget produces, or packages in this source will not correlate with what is installed.""" def test_initial(self): names = _lines("InputNames.txt") publishers = _lines("InputPublishers.txt") expected = _lines("NormalizationInitialIds.txt") self.assertEqual(len(names), len(publishers)) self.assertEqual(len(names), len(expected)) for name, publisher, want in zip(names, publishers, expected): if not (name or publisher or want): continue with self.subTest(name=name, publisher=publisher): got = normalize_publisher(publisher) + "." + normalize_name(name).name self.assertEqual(want, got) class WingetTestCases(unittest.TestCase): """The rest of winget-cli's `NameNormalization.cpp` tests.""" def test_architecture(self): cases = { "Name": None, "Name x86": "X86", "Name x86_64": "X64", "Name (64 bit)": "X64", "Name 32/64 bit": None, "Fox86": None, } for name, architecture in cases.items(): with self.subTest(name=name): self.assertEqual(architecture, normalize_name(name).architecture) def test_locale(self): cases = { "Name": "", "Name en-US": "en-us", "Name (es-mx)": "es-mx", "Names-mx": "", } for name, locale in cases.items(): with self.subTest(name=name): self.assertEqual(locale, normalize_name(name).locale) def test_kb_numbers(self): self.assertEqual("FixforKB42", normalize_name("Fix for (KB42)").name) def test_preserve_whitespace(self): self.assertEqual("Some Name", normalize_name("Some Name", preserve_whitespace=True).name) self.assertEqual("Some Publisher", normalize_publisher("Some Publisher Corp", preserve_whitespace=True)) def test_normalized_name(self): name = normalize_name("Name(X64)") self.assertEqual("Name", name.get()) self.assertEqual("Name(X64)", name.get(include_architecture=True)) name = normalize_name("Name") self.assertEqual("Name", name.get()) self.assertEqual("Name", name.get(include_architecture=True)) if __name__ == "__main__": unittest.main()