use crate::logic::sandbox::parse::{parse_pkgbuild_conflicts, parse_pkgbuild_deps};
#[test]
fn test_parse_pkgbuild_deps_basic() {
let pkgbuild = r"
pkgname=test-package
pkgver=1.0.0
depends=('foo' 'bar>=1.2')
makedepends=('make' 'gcc')
";
let (depends, makedepends, checkdepends, optdepends) = parse_pkgbuild_deps(pkgbuild);
assert_eq!(depends.len(), 2);
assert!(depends.contains(&"foo".to_string()));
assert!(depends.contains(&"bar>=1.2".to_string()));
assert_eq!(makedepends.len(), 2);
assert!(makedepends.contains(&"make".to_string()));
assert!(makedepends.contains(&"gcc".to_string()));
assert_eq!(checkdepends.len(), 0);
assert_eq!(optdepends.len(), 0);
}
#[test]
fn test_parse_pkgbuild_deps_append() {
let pkgbuild = r#"
pkgname=test-package
pkgver=1.0.0
package() {
depends+=(foo bar)
cd $_pkgname
make DESTDIR="$pkgdir" PREFIX=/usr install
}
"#;
let (depends, makedepends, checkdepends, optdepends) = parse_pkgbuild_deps(pkgbuild);
assert_eq!(depends.len(), 2);
assert!(depends.contains(&"foo".to_string()));
assert!(depends.contains(&"bar".to_string()));
assert_eq!(makedepends.len(), 0);
assert_eq!(checkdepends.len(), 0);
assert_eq!(optdepends.len(), 0);
}
#[test]
fn test_parse_pkgbuild_deps_unquoted() {
let pkgbuild = r"
pkgname=test-package
depends=(foo bar libcairo.so libdbus-1.so)
";
let (depends, makedepends, checkdepends, optdepends) = parse_pkgbuild_deps(pkgbuild);
assert_eq!(depends.len(), 2);
assert!(depends.contains(&"foo".to_string()));
assert!(depends.contains(&"bar".to_string()));
assert_eq!(makedepends.len(), 0);
assert_eq!(checkdepends.len(), 0);
assert_eq!(optdepends.len(), 0);
}
#[test]
fn test_parse_pkgbuild_deps_multiline() {
let pkgbuild = r"
pkgname=test-package
depends=(
'foo'
'bar>=1.2'
'baz'
)
";
let (depends, makedepends, checkdepends, optdepends) = parse_pkgbuild_deps(pkgbuild);
assert_eq!(depends.len(), 3);
assert!(depends.contains(&"foo".to_string()));
assert!(depends.contains(&"bar>=1.2".to_string()));
assert!(depends.contains(&"baz".to_string()));
assert_eq!(makedepends.len(), 0);
assert_eq!(checkdepends.len(), 0);
assert_eq!(optdepends.len(), 0);
}
#[test]
fn test_parse_pkgbuild_deps_makedepends_append() {
let pkgbuild = r"
pkgname=test-package
build() {
makedepends+=(cmake ninja)
cmake -B build
}
";
let (depends, makedepends, checkdepends, optdepends) = parse_pkgbuild_deps(pkgbuild);
assert_eq!(makedepends.len(), 2);
assert!(makedepends.contains(&"cmake".to_string()));
assert!(makedepends.contains(&"ninja".to_string()));
assert_eq!(depends.len(), 0);
assert_eq!(checkdepends.len(), 0);
assert_eq!(optdepends.len(), 0);
}
#[test]
fn test_parse_pkgbuild_deps_jujutsu_git_scenario() {
let pkgbuild = r"
pkgname=jujutsu-git
pkgver=0.1.0
pkgdesc=Git-compatible VCS that is both simple and powerful
url=https://github.com/martinvonz/jj
license=(Apache-2.0)
arch=(i686 x86_64 armv6h armv7h)
depends=(
glibc
libc.so
libm.so
)
makedepends=(
libgit2
libgit2.so
libssh2
libssh2.so)
openssh
git)
cargo
checkdepends=()
optdepends=()
source=($pkgname::git+$url)
";
let (depends, makedepends, checkdepends, optdepends) = parse_pkgbuild_deps(pkgbuild);
assert_eq!(depends.len(), 1);
assert!(depends.contains(&"glibc".to_string()));
assert_eq!(makedepends.len(), 2);
assert!(makedepends.contains(&"libgit2".to_string()));
assert!(makedepends.contains(&"libssh2".to_string()));
assert_eq!(checkdepends.len(), 0);
assert_eq!(optdepends.len(), 0);
}
#[test]
fn test_parse_pkgbuild_deps_ignore_other_fields() {
let pkgbuild = r"
pkgname=test-package
pkgver=1.0.0
pkgdesc=Test package description
url=https://example.com
license=(MIT)
arch=(x86_64)
source=($pkgname-$pkgver.tar.gz)
depends=(foo bar)
makedepends=(make)
";
let (depends, makedepends, checkdepends, optdepends) = parse_pkgbuild_deps(pkgbuild);
assert_eq!(depends.len(), 2);
assert!(depends.contains(&"foo".to_string()));
assert!(depends.contains(&"bar".to_string()));
assert_eq!(makedepends.len(), 1);
assert!(makedepends.contains(&"make".to_string()));
assert_eq!(checkdepends.len(), 0);
assert_eq!(optdepends.len(), 0);
}
#[test]
fn test_parse_pkgbuild_deps_filter_invalid_names() {
let pkgbuild = r"
depends=('valid-package' 'invalid)' '=invalid' 'a' 'valid>=1.0')
";
let (depends, makedepends, checkdepends, optdepends) = parse_pkgbuild_deps(pkgbuild);
assert_eq!(depends.len(), 2);
assert!(depends.contains(&"valid-package".to_string()));
assert!(depends.contains(&"valid>=1.0".to_string()));
assert_eq!(makedepends.len(), 0);
assert_eq!(checkdepends.len(), 0);
assert_eq!(optdepends.len(), 0);
}
#[test]
fn test_parse_pkgbuild_conflicts_basic() {
let pkgbuild = r"
pkgname=jujutsu-git
pkgver=0.1.0
conflicts=('jujutsu')
";
let conflicts = parse_pkgbuild_conflicts(pkgbuild);
assert_eq!(conflicts.len(), 1);
assert!(conflicts.contains(&"jujutsu".to_string()));
}
#[test]
fn test_parse_pkgbuild_conflicts_multiline() {
let pkgbuild = r"
pkgname=pacsea-git
pkgver=0.1.0
conflicts=(
'pacsea'
'pacsea-bin'
)
";
let conflicts = parse_pkgbuild_conflicts(pkgbuild);
assert_eq!(conflicts.len(), 2);
assert!(conflicts.contains(&"pacsea".to_string()));
assert!(conflicts.contains(&"pacsea-bin".to_string()));
}
#[test]
fn test_parse_pkgbuild_conflicts_with_versions() {
let pkgbuild = r"
pkgname=test-package
conflicts=('old-pkg<2.0' 'new-pkg>=3.0')
";
let conflicts = parse_pkgbuild_conflicts(pkgbuild);
assert_eq!(conflicts.len(), 2);
assert!(conflicts.contains(&"old-pkg".to_string()));
assert!(conflicts.contains(&"new-pkg".to_string()));
}
#[test]
fn test_parse_pkgbuild_conflicts_filter_so() {
let pkgbuild = r"
pkgname=test-package
conflicts=('foo' 'libcairo.so' 'bar' 'libdbus-1.so=1-64')
";
let conflicts = parse_pkgbuild_conflicts(pkgbuild);
assert_eq!(conflicts.len(), 2);
assert!(conflicts.contains(&"foo".to_string()));
assert!(conflicts.contains(&"bar".to_string()));
}