329 lines
9.4 KiB
Lua
329 lines
9.4 KiB
Lua
--
|
|
-- tests/base/test_criteria.lua
|
|
-- Test suite for the criteria matching API.
|
|
-- Copyright (c) 2012-2015 Jason Perkins and the Premake project
|
|
--
|
|
|
|
local p = premake
|
|
local suite = test.declare("criteria")
|
|
local criteria = p.criteria
|
|
|
|
|
|
--
|
|
-- Setup and teardown
|
|
--
|
|
|
|
local crit
|
|
|
|
|
|
--
|
|
-- A criteria with no terms should satisfy any context.
|
|
--
|
|
|
|
function suite.matches_alwaysTrue_onNoFilterTerms()
|
|
crit = criteria.new {}
|
|
test.istrue(criteria.matches(crit, { configurations="Debug", system="Windows" }))
|
|
end
|
|
|
|
|
|
--
|
|
-- Should not match if any term is missing in the context.
|
|
--
|
|
|
|
function suite.matches_fails_onMissingContext()
|
|
crit = criteria.new { "system:Windows", "architecture:x86" }
|
|
test.isfalse(criteria.matches(crit, { configurations="Debug", system="Windows" }))
|
|
end
|
|
|
|
|
|
--
|
|
-- Context terms must match the entire criteria term.
|
|
--
|
|
|
|
function suite.matches_fails_onIncompleteTermMatch()
|
|
crit = criteria.new { "platforms:win64" }
|
|
test.isfalse(criteria.matches(crit, { platforms="win64 dll dcrt" }))
|
|
end
|
|
|
|
|
|
--
|
|
-- Wildcard matches should work.
|
|
--
|
|
|
|
function suite.matches_passes_onPatternMatch()
|
|
crit = criteria.new { "action:vs*" }
|
|
test.istrue(criteria.matches(crit, { action="vs2005" }))
|
|
end
|
|
|
|
|
|
--
|
|
-- The "not" modifier should fail the test if the term is matched.
|
|
--
|
|
|
|
function suite.matches_fails_onMatchWithNotModifier_afterPrefix()
|
|
crit = criteria.new { "system:not windows" }
|
|
test.isfalse(criteria.matches(crit, { system="windows" }))
|
|
end
|
|
|
|
function suite.matches_fails_onMatchWithNotModifier_beforePrefix()
|
|
crit = criteria.new { "not system:windows" }
|
|
test.isfalse(criteria.matches(crit, { system="windows" }))
|
|
end
|
|
|
|
function suite.matches_passes_onMissWithNotModifier_afterPrefix()
|
|
crit = criteria.new { "system:not windows" }
|
|
test.istrue(criteria.matches(crit, { system="linux" }))
|
|
end
|
|
|
|
function suite.matches_passes_onMissWithNotModifier_beforePrefix()
|
|
crit = criteria.new { "not system:windows" }
|
|
test.istrue(criteria.matches(crit, { system="linux" }))
|
|
end
|
|
|
|
function suite.matches_passes_onMissWithNotModifier_noPrefix()
|
|
crit = criteria.new { "not debug" }
|
|
test.istrue(criteria.matches(crit, { configurations="release" }))
|
|
end
|
|
|
|
|
|
--
|
|
-- The "or" modifier should pass if either term is present.
|
|
--
|
|
|
|
function suite.matches_passes_onFirstOrTermMatched()
|
|
crit = criteria.new { "system:windows or linux" }
|
|
test.istrue(criteria.matches(crit, { system="windows" }))
|
|
end
|
|
|
|
function suite.matches_passes_onSecondOrTermMatched()
|
|
crit = criteria.new { "system:windows or linux" }
|
|
test.istrue(criteria.matches(crit, { system="linux" }))
|
|
end
|
|
|
|
function suite.matches_passes_onThirdOrTermMatched()
|
|
crit = criteria.new { "system:windows or linux or vs2005" }
|
|
test.istrue(criteria.matches(crit, { system="vs2005" }))
|
|
end
|
|
|
|
function suite.matches_fails_onNoOrTermMatched()
|
|
crit = criteria.new { "system:windows or linux" }
|
|
test.isfalse(criteria.matches(crit, { system="vs2005" }))
|
|
end
|
|
|
|
function suite.matches_passes_onMixedPrefixes_firstTermMatched_projectContext()
|
|
crit = criteria.new { "system:windows or files:core*" }
|
|
test.istrue(criteria.matches(crit, { system="windows" }))
|
|
end
|
|
|
|
function suite.matches_fails_onMixedPrefixes_firstTermMatched_fileContext()
|
|
crit = criteria.new { "system:windows or files:core*" }
|
|
test.isfalse(criteria.matches(crit, { system="windows", files="hello.cpp" }))
|
|
end
|
|
|
|
function suite.matches_passes_onMixedPrefixes_secondTermMatched()
|
|
crit = criteria.new { "system:windows or files:core*" }
|
|
test.istrue(criteria.matches(crit, { system="linux", files="coregraphics.cpp" }))
|
|
end
|
|
|
|
function suite.matches_fails_onMixedPrefixes_noTermMatched()
|
|
crit = criteria.new { "system:windows or files:core*" }
|
|
test.isfalse(criteria.matches(crit, { system="linux", files="hello.cpp" }))
|
|
end
|
|
|
|
|
|
--
|
|
-- The "not" modifier should fail on any match with an "or" modifier.
|
|
--
|
|
|
|
function suite.matches_passes_onNotOrMatchesFirst()
|
|
crit = criteria.new { "system:not windows or linux" }
|
|
test.isfalse(criteria.matches(crit, { system="windows" }))
|
|
end
|
|
|
|
function suite.matches_passes_onNotOrMatchesSecond()
|
|
crit = criteria.new { "system:windows or not linux" }
|
|
test.isfalse(criteria.matches(crit, { system="linux" }))
|
|
end
|
|
|
|
|
|
--
|
|
-- The "not" modifier should succeed with "or" if there are no matches.
|
|
--
|
|
|
|
function suite.matches_passes_onNoNotMatch()
|
|
crit = criteria.new { "system:not windows or linux" }
|
|
test.istrue(criteria.matches(crit, { system="macosx" }))
|
|
end
|
|
|
|
|
|
--
|
|
-- If the context specifies a filename, the filter must match it explicitly.
|
|
--
|
|
|
|
function suite.matches_passes_onFilenameAndMatchingPattern()
|
|
crit = criteria.new { "files:**.c", "system:windows" }
|
|
test.istrue(criteria.matches(crit, { system="windows", files="hello.c" }))
|
|
end
|
|
|
|
function suite.matches_fails_onFilenameAndNoMatchingPattern()
|
|
crit = criteria.new { "system:windows" }
|
|
test.isfalse(criteria.matches(crit, { system="windows", files="hello.c" }))
|
|
end
|
|
|
|
|
|
--
|
|
-- "Not" modifiers can also be used on filenames.
|
|
--
|
|
|
|
function suite.matches_passes_onFilenameMissAndNotModifier()
|
|
crit = criteria.new { "files:not **.c", "system:windows" }
|
|
test.istrue(criteria.matches(crit, { system="windows", files="hello.h" }))
|
|
end
|
|
|
|
function suite.matches_fails_onFilenameHitAndNotModifier()
|
|
crit = criteria.new { "files:not **.c", "system:windows" }
|
|
test.isfalse(criteria.matches(crit, { system="windows", files="hello.c" }))
|
|
end
|
|
|
|
|
|
--
|
|
-- If context provides a list of values, match against them.
|
|
--
|
|
|
|
function suite.matches_passes_termMatchesList()
|
|
crit = criteria.new { "options:debug" }
|
|
test.istrue(criteria.matches(crit, { options={ "debug", "logging" }}))
|
|
end
|
|
|
|
|
|
--
|
|
-- If no prefix is specified, default to "configurations".
|
|
--
|
|
|
|
function suite.matches_usesDefaultPrefix_onSingleTerm()
|
|
crit = criteria.new { "debug" }
|
|
test.istrue(criteria.matches(crit, { configurations="debug" }))
|
|
end
|
|
|
|
|
|
|
|
--
|
|
-- These tests use the older, unprefixed style of filter terms. This
|
|
-- approach will get phased out eventually, but are still included here
|
|
-- for backward compatibility testing.
|
|
--
|
|
|
|
function suite.matches_onEmptyCriteria_Unprefixed()
|
|
crit = criteria.new({}, true)
|
|
test.istrue(criteria.matches(crit, { "apple", "orange" }))
|
|
end
|
|
|
|
function suite.fails_onMissingContext_Unprefixed()
|
|
crit = criteria.new({ "orange", "pear" }, true)
|
|
test.isfalse(criteria.matches(crit, { "apple", "orange" }))
|
|
end
|
|
|
|
function suite.fails_onIncompleteMatch_Unprefixed()
|
|
crit = criteria.new({ "win64" }, true)
|
|
test.isfalse(criteria.matches(crit, { "win64 dll dcrt" }))
|
|
end
|
|
|
|
function suite.passes_onPatternMatch_Unprefixed()
|
|
crit = criteria.new({ "vs*" }, true)
|
|
test.istrue(criteria.matches(crit, { "vs2005" }))
|
|
end
|
|
|
|
function suite.fails_onNotMatch_Unprefixed()
|
|
crit = criteria.new({ "not windows" }, true)
|
|
test.isfalse(criteria.matches(crit, { "windows" }))
|
|
end
|
|
|
|
function suite.passes_onNotUnmatched_Unprefixed()
|
|
crit = criteria.new({ "not windows" }, true)
|
|
test.istrue(criteria.matches(crit, { "linux" }))
|
|
end
|
|
|
|
function suite.passes_onFirstOrTermMatched_Unprefixed()
|
|
crit = criteria.new({ "windows or linux" }, true)
|
|
test.istrue(criteria.matches(crit, { "windows" }))
|
|
end
|
|
|
|
function suite.passes_onSecondOrTermMatched_Unprefixed()
|
|
crit = criteria.new({ "windows or linux" }, true)
|
|
test.istrue(criteria.matches(crit, { "linux" }))
|
|
end
|
|
|
|
function suite.passes_onThirdOrTermMatched_Unprefixed()
|
|
crit = criteria.new({ "windows or linux or vs2005" }, true)
|
|
test.istrue(criteria.matches(crit, { "vs2005" }))
|
|
end
|
|
|
|
function suite.fails_onNoOrTermMatched_Unprefixed()
|
|
crit = criteria.new({ "windows or linux" }, true)
|
|
test.isfalse(criteria.matches(crit, { "vs2005" }))
|
|
end
|
|
|
|
function suite.passes_onNotOrMatchesFirst_Unprefixed()
|
|
crit = criteria.new({ "not windows or linux" }, true)
|
|
test.isfalse(criteria.matches(crit, { "windows" }))
|
|
end
|
|
|
|
function suite.passes_onNotOrMatchesSecond_Unprefixed()
|
|
crit = criteria.new({ "windows or not linux" }, true)
|
|
test.isfalse(criteria.matches(crit, { "linux" }))
|
|
end
|
|
|
|
function suite.passes_onNoNotMatch_Unprefixed()
|
|
crit = criteria.new({ "not windows or linux" }, true)
|
|
test.istrue(criteria.matches(crit, { "macosx" }))
|
|
end
|
|
|
|
function suite.passes_onFilenameAndMatchingPattern_Unprefixed()
|
|
crit = criteria.new({ "**.c", "windows" }, true)
|
|
test.istrue(criteria.matches(crit, { system="windows", files="hello.c" }))
|
|
end
|
|
|
|
function suite.fails_onFilenameAndNoMatchingPattern_Unprefixed()
|
|
crit = criteria.new({ "windows" }, true)
|
|
test.isfalse(criteria.matches(crit, { system="windows", files="hello.c" }))
|
|
end
|
|
|
|
function suite.fails_onFilenameAndNotModifier_Unprefixed()
|
|
crit = criteria.new({ "not linux" }, true)
|
|
test.isfalse(criteria.matches(crit, { system="windows", files="hello.c" }))
|
|
end
|
|
|
|
function suite.matches_passes_termMatchesList_Unprefixed()
|
|
crit = criteria.new({ "debug" }, true)
|
|
test.istrue(criteria.matches(crit, { options={ "debug", "logging" }}))
|
|
end
|
|
|
|
|
|
--
|
|
-- Should return nil and an error message on an invalid prefix.
|
|
--
|
|
|
|
function suite.returnsNilAndError_onInvalidPrefix()
|
|
crit, err = criteria.new { "gibble:Debug" }
|
|
test.isnil(crit)
|
|
test.isnotnil(err)
|
|
end
|
|
|
|
|
|
--
|
|
-- Should respect field value aliases, if present.
|
|
--
|
|
|
|
function suite.passes_onAliasedValue()
|
|
p.api.addAliases("system", { ["gnu-linux"] = "linux" })
|
|
crit = criteria.new { "system:gnu-linux" }
|
|
test.istrue(criteria.matches(crit, { system="linux" }))
|
|
end
|
|
|
|
function suite.passes_onAliasedValue_withMixedCase()
|
|
p.api.addAliases("system", { ["gnu-linux"] = "linux" })
|
|
crit = criteria.new { "System:GNU-Linux" }
|
|
test.istrue(criteria.matches(crit, { system="linux" }))
|
|
end
|
|
|