#!/bin/sh

base="$AUTOPKGTEST_TMP/module"
bcep_base="$AUTOPKGTEST_TMP/bcep"
tag=$(pypy3 -c 'import sys; print(sys.implementation.cache_tag)')

setUp() {
	mkdir -p $base/a $bcep_base
	touch $base/a/__init__.py
	touch $base/a/a_impl.py
	touch $base/b.py
}

tearDown() {
	rm -rf "$base" "$bcep_base"
}

testDirectory() {
	pypy3compile "$base"
	assertTrue $?
	assertTrue 'base __pycache__ exists' "[ -d $base/__pycache__ ]"
	assertTrue 'a __pycache__ exists' "[ -d $base/a/__pycache__ ]"
	assertTrue 'b compiled' "[ -f $base/__pycache__/b.$tag.pyc ]"
	assertTrue 'a compiled' "[ -f $base/a/__pycache__/__init__.$tag.pyc ]"
	assertTrue 'a.a_impl compiled' "[ -f $base/a/__pycache__/a_impl.$tag.pyc ]"

	pypy3clean "$base"
	assertTrue $?
	assertTrue 'base __pycache__ cleaned' "[ ! -d $base/__pycache__ ]"
	assertTrue 'a __pycache__ cleaned' "[ ! -d $base/a/__pycache__ ]"
	assertTrue 'b cleaned' "[ ! -f $base/__pycache__/b.$tag.pyc ]"
	assertTrue 'a cleaned' "[ ! -f $base/a/__pycache__/__init__.$tag.pyc ]"
	assertTrue 'a.a_impl cleaned' "[ ! -f $base/a/__pycache__/a_impl.$tag.pyc ]"
}

testDirectoryExclude() {
	pypy3compile "$base" -X '.*_impl'
	assertTrue $?
	assertTrue 'base __pycache__ exists' "[ -d $base/__pycache__ ]"
	assertTrue 'a __pycache__ exists' "[ -d $base/a/__pycache__ ]"
	assertTrue 'b compiled' "[ -f $base/__pycache__/b.$tag.pyc ]"
	assertTrue 'a compiled' "[ -f $base/a/__pycache__/__init__.$tag.pyc ]"
	assertTrue 'a.a_impl NOT compiled' "[ ! -f $base/a/__pycache__/a_impl.$tag.pyc ]"
}

testDirBCEPComment() {
	echo "#dir|-4.0|$base/a" > "$bcep_base/autopkgtest"
	pypy3compile "$base" --bcep-path "$bcep_base"
	assertTrue $?
	assertTrue 'base __pycache__ exists' "[ -d $base/__pycache__ ]"
	assertTrue 'a __pycache__ exists' "[ -d $base/a/__pycache__ ]"
	assertTrue 'b compiled' "[ -f $base/__pycache__/b.$tag.pyc ]"
	assertTrue 'a compiled' "[ -f $base/a/__pycache__/__init__.$tag.pyc ]"
	assertTrue 'a.a_impl compiled' "[ -f $base/a/__pycache__/a_impl.$tag.pyc ]"
}

testDirBCEPVrange() {
	echo "dir|-3.7|$base/a" > "$bcep_base/autopkgtest"
	pypy3compile "$base" --bcep-path "$bcep_base"
	assertTrue $?
	assertTrue 'base __pycache__ exists' "[ -d $base/__pycache__ ]"
	assertTrue 'a __pycache__ exists' "[ -d $base/a/__pycache__ ]"
	assertTrue 'b compiled' "[ -f $base/__pycache__/b.$tag.pyc ]"
	assertTrue 'a compiled' "[ -f $base/a/__pycache__/__init__.$tag.pyc ]"
	assertTrue 'a.a_impl compiled' "[ -f $base/a/__pycache__/a_impl.$tag.pyc ]"
}

testDirBCEPExclude() {
	echo "dir|-4.0|$base/a" > "$bcep_base/autopkgtest"
	pypy3compile "$base" --bcep-path "$bcep_base"
	assertTrue $?
	assertTrue 'base __pycache__ exists' "[ -d $base/__pycache__ ]"
	assertTrue 'a __pycache__ DOES NOT exist' "[ ! -d $base/a/__pycache__ ]"
	assertTrue 'b compiled' "[ -f $base/__pycache__/b.$tag.pyc ]"
	assertTrue 'a NOT compiled' "[ ! -f $base/a/__pycache__/__init__.$tag.pyc ]"
	assertTrue 'a.a_impl NOT compiled' "[ ! -f $base/a/__pycache__/a_impl.$tag.pyc ]"
}

testDirTrailingSlashBCEPExclude() {
	echo "dir|-4.0|$base/a/" > "$bcep_base/autopkgtest"
	pypy3compile "$base" --bcep-path "$bcep_base"
	assertTrue $?
	assertTrue 'base __pycache__ exists' "[ -d $base/__pycache__ ]"
	assertTrue 'a __pycache__ DOES NOT exist' "[ ! -d $base/a/__pycache__ ]"
	assertTrue 'b compiled' "[ -f $base/__pycache__/b.$tag.pyc ]"
	assertTrue 'a NOT compiled' "[ ! -f $base/a/__pycache__/__init__.$tag.pyc ]"
	assertTrue 'a.a_impl NOT compiled' "[ ! -f $base/a/__pycache__/a_impl.$tag.pyc ]"
}

testFileBCEPExclude() {
	echo "file|-4.0|$base/b.py" > "$bcep_base/autopkgtest"
	pypy3compile "$base" --bcep-path "$bcep_base"
	assertTrue $?
	assertTrue 'base __pycache__ DOES NOT exist' "[ ! -d $base/__pycache__ ]"
	assertTrue 'a __pycache__ exists' "[ -d $base/a/__pycache__ ]"
	assertTrue 'b NOT compiled' "[ ! -f $base/__pycache__/b.$tag.pyc ]"
	assertTrue 'a compiled' "[ -f $base/a/__pycache__/__init__.$tag.pyc ]"
	assertTrue 'a.a_impl compiled' "[ -f $base/a/__pycache__/a_impl.$tag.pyc ]"
}

testRegexBCEPExclude() {
	echo "re|-4.0|$base/a|.*_impl\.py" > "$bcep_base/autopkgtest"
	pypy3compile "$base" --bcep-path "$bcep_base"
	assertTrue $?
	assertTrue 'base __pycache__ exists' "[ -d $base/__pycache__ ]"
	assertTrue 'a __pycache__ exists' "[ -d $base/a/__pycache__ ]"
	assertTrue 'b compiled' "[ -f $base/__pycache__/b.$tag.pyc ]"
	assertTrue 'a compiled' "[ -f $base/a/__pycache__/__init__.$tag.pyc ]"
	assertTrue 'a.a_impl NOT compiled' "[ ! -f $base/a/__pycache__/a_impl.$tag.pyc ]"
}

testVInclude() {
	pypy3compile "$base" -V 3-
	assertTrue $?
	assertTrue 'base __pycache__ exists' "[ -d $base/__pycache__ ]"
	assertTrue 'a __pycache__ exists' "[ -d $base/a/__pycache__ ]"
	assertTrue 'b compiled' "[ -f $base/__pycache__/b.$tag.pyc ]"
	assertTrue 'a compiled' "[ -f $base/a/__pycache__/__init__.$tag.pyc ]"
	assertTrue 'a.a_impl compiled' "[ -f $base/a/__pycache__/a_impl.$tag.pyc ]"
}

testVExclude() {
	pypy3compile "$base" -V -3
	assertTrue $?
	assertTrue 'base __pycache__ DOES NOT exist' "[ ! -d $base/__pycache__ ]"
	assertTrue 'a __pycache__ DOES NOT exist' "[ ! -d $base/a/__pycache__ ]"
	assertTrue 'b NOT compiled' "[ ! -f $base/__pycache__/b.$tag.pyc ]"
	assertTrue 'a NOT compiled' "[ ! -f $base/a/__pycache__/__init__.$tag.pyc ]"
	assertTrue 'a.a_impl NOT compiled' "[ ! -f $base/a/__pycache__/a_impl.$tag.pyc ]"
}

. shunit2
