>>> from cpe.cpe2_3_wfn import CPE2_3_WFN
>>> from cpe.cpeset2_3 import CPESet2_3

-----------------------------------------------
Test for _compare(cls, source, target)
-----------------------------------------------

- TEST:
>>> CPESet2_3._compare("a", "a") == CPESet2_3.LOGICAL_VALUE_EQUAL
True

- TEST:
>>> CPESet2_3._compare("Adobe", "ANY") == CPESet2_3.LOGICAL_VALUE_SUBSET
True

- TEST:
>>> CPESet2_3._compare("ANY", "Reader") == CPESet2_3.LOGICAL_VALUE_SUPERSET
True

- TEST:
>>> CPESet2_3._compare("9\.*", "9\.3\.2") == CPESet2_3.LOGICAL_VALUE_SUPERSET
True

- TEST:
>>> CPESet2_3._compare("ANY", "NA") == CPESet2_3.LOGICAL_VALUE_SUPERSET
True

- TEST:
>>> CPESet2_3._compare("ANY", "NA") == CPESet2_3.LOGICAL_VALUE_SUPERSET
True

- TEST:
>>> CPESet2_3._compare("PalmOS", "NA") == CPESet2_3.LOGICAL_VALUE_DISJOINT
True

----------------------------------------------
Test for _compare_strings(cls, source, target)
----------------------------------------------

- TEST:
>>> CPESet2_3._compare_strings("and", "not") == CPESet2_3.LOGICAL_VALUE_DISJOINT
True

- TEST:
>>> CPESet2_3._compare_strings("mac*", "not") == CPESet2_3.LOGICAL_VALUE_DISJOINT
True

- TEST:
>>> CPESet2_3._compare_strings("mac*", "mac") == CPESet2_3.LOGICAL_VALUE_SUPERSET
True

----------------------------------
Test for _is_string(cls, arg)
----------------------------------

- TEST:
>>> CPESet2_3._is_string("ANY")
False

- TEST:
>>> CPESet2_3._is_string("NA")
False

- TEST:
>>> CPESet2_3._is_string("otherValue")
True


------------------------------------
Test for _contains_wildcards(cls, s)
------------------------------------

- TEST:
>>> CPESet2_3._contains_wildcards("foo")
False

- TEST:
>>> CPESet2_3._contains_wildcards("foo\\\?")
False

- TEST:
>>> CPESet2_3._contains_wildcards("foo*")
True

- TEST:
>>> CPESet2_3._contains_wildcards("\\\*bar")
False

- TEST:
>>> CPESet2_3._contains_wildcards("?bar")
True

- TEST:
>>> CPESet2_3._contains_wildcards(r"8\.\*")
False


----------------------------------------
Test for _is_even_wildcards(cls, str, idx)
----------------------------------------

- TEST:
>>> CPESet2_3._is_even_wildcards(r"lin\ux", 4)
False

- TEST:
>>> CPESet2_3._is_even_wildcards(r"lin\\ux", 5)
True


----------------------------------------
Test for __len__(self)
----------------------------------------

- TEST: empty set
>>> s = CPESet2_3()
>>> len(s)
0

- TEST: set with two CPE elements
>>> wfn1 = r'wfn:[part="a", vendor="hp", product="insight_diagnostics", version="8\.*", sw_edition="?", target_sw=ANY, target_hw="x32"]'
>>> wfn2 = r'wfn:[part="a", vendor="hp", product="nvidia", version="8\.*", sw_edition="?", target_sw=ANY, target_hw="x32"]'
>>> c1 = CPE2_3_WFN(wfn1)
>>> c2 = CPE2_3_WFN(wfn2)
>>> s = CPESet2_3()
>>> s.append(c1)
>>> s.append(c2)
>>> len(s)
2

- TEST: set with three CPE elements and one repeated
>>> wfn1 = r'wfn:[part="a", vendor="hp", product="insight_diagnostics", version="8\.*", sw_edition="?", target_sw=ANY, target_hw="x32"]'
>>> wfn1 = r'wfn:[part="a", vendor="hp", product="insight_diagnostics", version="8\.*", sw_edition="?", target_sw=ANY, target_hw="x32"]'
>>> c1 = CPE2_3_WFN(wfn1)
>>> c2 = CPE2_3_WFN(wfn2)
>>> c3 = CPE2_3_WFN(wfn2)
>>> s = CPESet2_3()
>>> s.append(c1)
>>> s.append(c2)
>>> s.append(c3)
>>> len(s)
2


----------------------------------------
Test for name_match(self, wfn)
----------------------------------------

- TEST: in version source with * wildcards and target with a simple value (SUPERSET)
>>> wfn1 = r'wfn:[part="a", vendor="microsoft", product="internet_explorer", version="8\.0\.6", update="beta", edition=ANY]'
>>> wfn2 = r'wfn:[part="o", vendor="microsoft", product="windows", version="6\.0\*", update="sp2", edition=ANY]'
>>> wfn3 = r'wfn:[part="a", vendor="microsoft", product="internet_explorer", version="8\.0\.*"]'
>>> c1 = CPE2_3_WFN(wfn1)
>>> c2 = CPE2_3_WFN(wfn2)
>>> m = CPE2_3_WFN(wfn3)
>>> s = CPESet2_3()
>>> s.append(c1)
>>> s.append(c2)
>>> s.name_match(m)
True

- TEST: in version source with ? wildcards and target with a simple value  (SUPERSET)
>>> wfn1 = r'wfn:[part="a", vendor="microsoft", product="internet_explorer", version="8\.1\.2", update="sp9", edition=ANY]'
>>> wfn2 = r'wfn:[part="o", vendor="microsoft", product="windows", version="6\.0\*", update="sp2", edition=ANY]'
>>> wfn3 = r'wfn:[part="a", vendor="microsoft", product="internet_explorer", version="8\.*", update="sp?"]'
>>> c1 = CPE2_3_WFN(wfn1)
>>> c2 = CPE2_3_WFN(wfn2)
>>> m = CPE2_3_WFN(wfn3)
>>> s = CPESet2_3()
>>> s.append(c1)
>>> s.append(c2)
>>> s.name_match(m)
True


- TEST: in version source with wildcards and target with a logical value ANY (SUBSET)
>>> wfn1 = 'wfn:[part="a", vendor="microsoft", product="internet_explorer"]'
>>> wfn2 = r'wfn:[part="o", vendor="microsoft", product="windows", version="6\.0\*", update="sp2", edition=ANY]'
>>> wfn3 = r'wfn:[part="a", vendor="microsoft", product="internet_explorer", version="8\.0\.*"]'
>>> c1 = CPE2_3_WFN(wfn1)
>>> c2 = CPE2_3_WFN(wfn2)
>>> m = CPE2_3_WFN(wfn3)
>>> s = CPESet2_3()
>>> s.append(c1)
>>> s.append(c2)
>>> s.name_match(m)
False

- TEST: in version source with a logical value ANY and target with wildcards (UNDEFINED)
>>> wfn1 = r'wfn:[part="a", vendor="microsoft", product="internet_explorer", version="8\.0\.*"]'
>>> wfn2 = r'wfn:[part="o", vendor="microsoft", product="windows", version="6\.0\*", update="sp2", edition=ANY]'
>>> wfn3 = 'wfn:[part="a", vendor="microsoft", product="internet_explorer"]'
>>> c1 = CPE2_3_WFN(wfn1)
>>> c2 = CPE2_3_WFN(wfn2)
>>> m = CPE2_3_WFN(wfn3)
>>> s = CPESet2_3()
>>> s.append(c1)
>>> s.append(c2)
>>> s.name_match(m)
False

- TEST: not matching
>>> wfn1 = r'wfn:[part="a", vendor="microsoft", product="internet_explorer", version="8\.0\*", update="beta", edition=ANY]'
>>> wfn2 = r'wfn:[part="o", vendor="microsoft", product="windows", version="6\.0*", update="sp2", edition=ANY]'
>>> wfn3 = 'wfn:[part="h", vendor="hp", product="compact"]'
>>> c1 = CPE2_3_WFN(wfn1)
>>> c2 = CPE2_3_WFN(wfn2)
>>> m = CPE2_3_WFN(wfn3)
>>> s = CPESet2_3()
>>> s.append(c1)
>>> s.append(c2)
>>> s.name_match(m)
False


----------------------------------------
Test for operations
----------------------------------------

- TEST:
>>> s = CPE2_3_WFN('wfn:[part="a"]')
>>> t = CPE2_3_WFN('wfn:[part="o"]')
>>> CPESet2_3.cpe_disjoint(s, t)
True

- TEST:
>>> s = CPE2_3_WFN('wfn:[part=ANY]')
>>> t = CPE2_3_WFN('wfn:[part="o"]')
>>> CPESet2_3.cpe_disjoint(s, t)
False

- TEST:
>>> s = CPE2_3_WFN('wfn:[part=ANY]')
>>> t = CPE2_3_WFN('wfn:[part="o"]')
>>> CPESet2_3.cpe_superset(s, t)
True

- TEST:
>>> s = CPE2_3_WFN('wfn:[part=ANY]')
>>> t = CPE2_3_WFN('wfn:[part="o"]')
>>> CPESet2_3.cpe_subset(s, t)
False

- TEST:
>>> s = CPE2_3_WFN('wfn:[part="o"]')
>>> t = CPE2_3_WFN('wfn:[part="o"]')
>>> CPESet2_3.cpe_equal(s, t)
True
