|
|
|
# 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)
|