test/unittest_selectors.py
changeset 8190 2a3c1b787688
parent 7986 552d41237156
equal deleted inserted replaced
8189:2ee0ef069fa7 8190:2a3c1b787688
     1 # copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     1 # copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     2 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
     2 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
     3 #
     3 #
     4 # This file is part of CubicWeb.
     4 # This file is part of CubicWeb.
     5 #
     5 #
     6 # CubicWeb is free software: you can redistribute it and/or modify it under the
     6 # CubicWeb is free software: you can redistribute it and/or modify it under the
    21 from operator import eq, lt, le, gt
    21 from operator import eq, lt, le, gt
    22 from logilab.common.testlib import TestCase, unittest_main
    22 from logilab.common.testlib import TestCase, unittest_main
    23 
    23 
    24 from cubicweb import Binary
    24 from cubicweb import Binary
    25 from cubicweb.devtools.testlib import CubicWebTC
    25 from cubicweb.devtools.testlib import CubicWebTC
    26 from cubicweb.appobject import Selector, AndSelector, OrSelector
    26 from cubicweb.predicates import (is_instance, adaptable, match_kwargs, match_user_groups,
    27 from cubicweb.selectors import (is_instance, adaptable, match_kwargs, match_user_groups,
       
    28                                 multi_lines_rset, score_entity, is_in_state,
    27                                 multi_lines_rset, score_entity, is_in_state,
    29                                 on_transition, rql_condition, relation_possible)
    28                                 on_transition, rql_condition, relation_possible)
    30 from cubicweb.web import action
    29 from cubicweb.web import action
    31 
    30 
    32 
       
    33 class _1_(Selector):
       
    34     def __call__(self, *args, **kwargs):
       
    35         return 1
       
    36 
       
    37 class _0_(Selector):
       
    38     def __call__(self, *args, **kwargs):
       
    39         return 0
       
    40 
       
    41 def _2_(*args, **kwargs):
       
    42     return 2
       
    43 
       
    44 
       
    45 class SelectorsTC(TestCase):
       
    46     def test_basic_and(self):
       
    47         selector = _1_() & _1_()
       
    48         self.assertEqual(selector(None), 2)
       
    49         selector = _1_() & _0_()
       
    50         self.assertEqual(selector(None), 0)
       
    51         selector = _0_() & _1_()
       
    52         self.assertEqual(selector(None), 0)
       
    53 
       
    54     def test_basic_or(self):
       
    55         selector = _1_() | _1_()
       
    56         self.assertEqual(selector(None), 1)
       
    57         selector = _1_() | _0_()
       
    58         self.assertEqual(selector(None), 1)
       
    59         selector = _0_() | _1_()
       
    60         self.assertEqual(selector(None), 1)
       
    61         selector = _0_() | _0_()
       
    62         self.assertEqual(selector(None), 0)
       
    63 
       
    64     def test_selector_and_function(self):
       
    65         selector = _1_() & _2_
       
    66         self.assertEqual(selector(None), 3)
       
    67         selector = _2_ & _1_()
       
    68         self.assertEqual(selector(None), 3)
       
    69 
       
    70     def test_three_and(self):
       
    71         selector = _1_() & _1_() & _1_()
       
    72         self.assertEqual(selector(None), 3)
       
    73         selector = _1_() & _0_() & _1_()
       
    74         self.assertEqual(selector(None), 0)
       
    75         selector = _0_() & _1_() & _1_()
       
    76         self.assertEqual(selector(None), 0)
       
    77 
       
    78     def test_three_or(self):
       
    79         selector = _1_() | _1_() | _1_()
       
    80         self.assertEqual(selector(None), 1)
       
    81         selector = _1_() | _0_() | _1_()
       
    82         self.assertEqual(selector(None), 1)
       
    83         selector = _0_() | _1_() | _1_()
       
    84         self.assertEqual(selector(None), 1)
       
    85         selector = _0_() | _0_() | _0_()
       
    86         self.assertEqual(selector(None), 0)
       
    87 
       
    88     def test_composition(self):
       
    89         selector = (_1_() & _1_()) & (_1_() & _1_())
       
    90         self.assertTrue(isinstance(selector, AndSelector))
       
    91         self.assertEqual(len(selector.selectors), 4)
       
    92         self.assertEqual(selector(None), 4)
       
    93         selector = (_1_() & _0_()) | (_1_() & _1_())
       
    94         self.assertTrue(isinstance(selector, OrSelector))
       
    95         self.assertEqual(len(selector.selectors), 2)
       
    96         self.assertEqual(selector(None), 2)
       
    97 
       
    98     def test_search_selectors(self):
       
    99         sel = is_instance('something')
       
   100         self.assertIs(sel.search_selector(is_instance), sel)
       
   101         csel = AndSelector(sel, Selector())
       
   102         self.assertIs(csel.search_selector(is_instance), sel)
       
   103         csel = AndSelector(Selector(), sel)
       
   104         self.assertIs(csel.search_selector(is_instance), sel)
       
   105         self.assertIs(csel.search_selector((AndSelector, OrSelector)), csel)
       
   106         self.assertIs(csel.search_selector((OrSelector, AndSelector)), csel)
       
   107         self.assertIs(csel.search_selector((is_instance, score_entity)),  sel)
       
   108         self.assertIs(csel.search_selector((score_entity, is_instance)), sel)
       
   109 
       
   110     def test_inplace_and(self):
       
   111         selector = _1_()
       
   112         selector &= _1_()
       
   113         selector &= _1_()
       
   114         self.assertEqual(selector(None), 3)
       
   115         selector = _1_()
       
   116         selector &= _0_()
       
   117         selector &= _1_()
       
   118         self.assertEqual(selector(None), 0)
       
   119         selector = _0_()
       
   120         selector &= _1_()
       
   121         selector &= _1_()
       
   122         self.assertEqual(selector(None), 0)
       
   123         selector = _0_()
       
   124         selector &= _0_()
       
   125         selector &= _0_()
       
   126         self.assertEqual(selector(None), 0)
       
   127 
       
   128     def test_inplace_or(self):
       
   129         selector = _1_()
       
   130         selector |= _1_()
       
   131         selector |= _1_()
       
   132         self.assertEqual(selector(None), 1)
       
   133         selector = _1_()
       
   134         selector |= _0_()
       
   135         selector |= _1_()
       
   136         self.assertEqual(selector(None), 1)
       
   137         selector = _0_()
       
   138         selector |= _1_()
       
   139         selector |= _1_()
       
   140         self.assertEqual(selector(None), 1)
       
   141         selector = _0_()
       
   142         selector |= _0_()
       
   143         selector |= _0_()
       
   144         self.assertEqual(selector(None), 0)
       
   145 
    31 
   146 
    32 
   147 class ImplementsSelectorTC(CubicWebTC):
    33 class ImplementsSelectorTC(CubicWebTC):
   148     def test_etype_priority(self):
    34     def test_etype_priority(self):
   149         req = self.request()
    35         req = self.request()