# SPDX-License-Identifier: Apache-2.0 # Copyright © 2022-2023 Intel Corporation from __future__ import annotations import unittest import typing as T from mesonbuild.cargo import builder, cfg from mesonbuild.cargo.cfg import TokenType from mesonbuild.cargo.version import convert class CargoVersionTest(unittest.TestCase): def test_cargo_to_meson(self) -> None: cases: T.List[T.Tuple[str, T.List[str]]] = [ # Basic requirements ('>= 1', ['>= 1']), ('> 1', ['> 1']), ('= 1', ['= 1']), ('< 1', ['< 1']), ('<= 1', ['<= 1']), # tilde tests ('~1', ['>= 1', '< 2']), ('~1.1', ['>= 1.1', '< 1.2']), ('~1.1.2', ['>= 1.1.2', '< 1.2.0']), # Wildcards ('*', []), ('1.*', ['>= 1', '< 2']), ('2.3.*', ['>= 2.3', '< 2.4']), # Unqualified ('2', ['>= 2', '< 3']), ('2.4', ['>= 2.4', '< 3']), ('2.4.5', ['>= 2.4.5', '< 3']), ('0.0.0', ['< 1']), ('0.0', ['< 1']), ('0', ['< 1']), ('0.0.5', ['>= 0.0.5', '< 0.0.6']), ('0.5.0', ['>= 0.5', '< 0.6']), ('0.5', ['>= 0.5', '< 0.6']), # Caret (Which is the same as unqualified) ('^2', ['>= 2', '< 3']), ('^2.4', ['>= 2.4', '< 3']), ('^2.4.5', ['>= 2.4.5', '< 3']), ('^0.0.0', ['< 1']), ('^0.0', ['< 1']), ('^0', ['< 1']), ('^0.0.5', ['>= 0.0.5', '< 0.0.6']), ('^0.5.0', ['>= 0.5', '< 0.6']), ('^0.5', ['>= 0.5', '< 0.6']), # Multiple requirements ('>= 1.2.3, < 1.4.7', ['>= 1.2.3', '< 1.4.7']), ] for (data, expected) in cases: with self.subTest(): self.assertListEqual(convert(data), expected) class CargoCfgTest(unittest.TestCase): def test_lex(self) -> None: cases: T.List[T.Tuple[str, T.List[T.Tuple[TokenType, T.Optional[str]]]]] = [ ('"unix"', [(TokenType.STRING, 'unix')]), ('unix', [(TokenType.IDENTIFIER, 'unix')]), ('not(unix)', [ (TokenType.NOT, None), (TokenType.LPAREN, None), (TokenType.IDENTIFIER, 'unix'), (TokenType.RPAREN, None), ]), ('any(unix, windows)', [ (TokenType.ANY, None), (TokenType.LPAREN, None), (TokenType.IDENTIFIER, 'unix'), (TokenType.COMMA, None), (TokenType.IDENTIFIER, 'windows'), (TokenType.RPAREN, None), ]), ('target_arch = "x86_64"', [ (TokenType.IDENTIFIER, 'target_arch'), (TokenType.EQUAL, None), (TokenType.STRING, 'x86_64'), ]), ('all(target_arch = "x86_64", unix)', [ (TokenType.ALL, None), (TokenType.LPAREN, None), (TokenType.IDENTIFIER, 'target_arch'), (TokenType.EQUAL, None), (TokenType.STRING, 'x86_64'), (TokenType.COMMA, None), (TokenType.IDENTIFIER, 'unix'), (TokenType.RPAREN, None), ]), ] for data, expected in cases: with self.subTest(): self.assertListEqual(list(cfg.lexer(data)), expected) def test_parse(self) -> None: cases = [ ('target_os = "windows"', cfg.Equal('', cfg.Identifier('', "target_os"), cfg.String('', "windows"))), ('target_arch = "x86"', cfg.Equal('', cfg.Identifier('', "target_arch"), cfg.String('', "x86"))), ('target_family = "unix"', cfg.Equal('', cfg.Identifier('', "target_family"), cfg.String('', "unix"))), ('any(target_arch = "x86", target_arch = "x86_64")', cfg.Any( '', [ cfg.Equal('', cfg.Identifier('', "target_arch"), cfg.String('', "x86")), cfg.Equal('', cfg.Identifier('', "target_arch"), cfg.String('', "x86_64")), ])), ('all(target_arch = "x86", target_os = "linux")', cfg.All( '', [ cfg.Equal('', cfg.Identifier('', "target_arch"), cfg.String('', "x86")), cfg.Equal('', cfg.Identifier('', "target_os"), cfg.String('', "linux")), ])), ('not(all(target_arch = "x86", target_os = "linux"))', cfg.Not( '', cfg.All( '', [ cfg.Equal('', cfg.Identifier('', "target_arch"), cfg.String('', "x86")), cfg.Equal('', cfg.Identifier('', "target_os"), cfg.String('', "linux")), ]))), ] for data, expected in cases: with self.subTest(): self.assertEqual(cfg.parse(iter(cfg.lexer(data)), ''), expected) def test_ir_to_meson(self) -> None: HOST_MACHINE = builder.identifier('host_machine', '') cases = [ ('target_os = "windows"', builder.equal(builder.method('system', HOST_MACHINE), builder.string('windows', ''))), ('target_arch = "x86"', builder.equal(builder.method('cpu_family', HOST_MACHINE), builder.string('x86', ''))), ('target_family = "unix"', builder.equal(builder.method('system', HOST_MACHINE), builder.string('unix', ''))), ('not(target_arch = "x86")', builder.not_(builder.equal( builder.method('cpu_family', HOST_MACHINE), builder.string('x86', '')), '')), ('any(target_arch = "x86", target_arch = "x86_64")', builder.or_( builder.equal(builder.method('cpu_family', HOST_MACHINE), builder.string('x86', '')), builder.equal(builder.method('cpu_family', HOST_MACHINE), builder.string('x86_64', '')))), ('any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64")', builder.or_( builder.equal(builder.method('cpu_family', HOST_MACHINE), builder.string('x86', '')), builder.or_( builder.equal(builder.method('cpu_family', HOST_MACHINE), builder.string('x86_64', '')), builder.equal(builder.method('cpu_family', HOST_MACHINE), builder.string('aarch64', ''))))), ('all(target_arch = "x86", target_arch = "x86_64")', builder.and_( builder.equal(builder.method('cpu_family', HOST_MACHINE), builder.string('x86', '')), builder.equal(builder.method('cpu_family', HOST_MACHINE), builder.string('x86_64', '')))), ('all(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64")', builder.and_( builder.equal(builder.method('cpu_family', HOST_MACHINE), builder.string('x86', '')), builder.and_( builder.equal(builder.method('cpu_family', HOST_MACHINE), builder.string('x86_64', '')), builder.equal(builder.method('cpu_family', HOST_MACHINE), builder.string('aarch64', ''))))), ] for data, expected in cases: with self.subTest(): value = cfg.ir_to_meson(cfg.parse(iter(cfg.lexer(data)), '')) self.assertEqual(value, expected)