1
2cimport cython
3
4import sys
5IS_PY3 = sys.version_info[0] >= 3
6
7bstring1 = b"abcdefg"
8bstring2 = b"1234567"
9
10string1 = "abcdefg"
11string2 = "1234567"
12
13ustring1 = u"abcdefg"
14ustring2 = u"1234567"
15
16# unicode
17
18@cython.test_assert_path_exists(
19    "//PrimaryCmpNode",
20    "//PrimaryCmpNode[@is_pycmp = False]",
21)
22def unicode_eq(unicode s1, unicode s2):
23    """
24    >>> unicode_eq(ustring1, ustring1)
25    True
26    >>> unicode_eq(ustring1+ustring2, ustring1+ustring2)
27    True
28    >>> unicode_eq(ustring1, ustring2)
29    False
30    """
31    return s1 == s2
32
33@cython.test_assert_path_exists(
34    "//PrimaryCmpNode",
35    "//PrimaryCmpNode[@is_pycmp = False]",
36)
37def unicode_neq(unicode s1, unicode s2):
38    """
39    >>> unicode_neq(ustring1, ustring1)
40    False
41    >>> unicode_neq(ustring1+ustring2, ustring1+ustring2)
42    False
43    >>> unicode_neq(ustring1, ustring2)
44    True
45    """
46    return s1 != s2
47
48@cython.test_assert_path_exists(
49    "//PrimaryCmpNode",
50    "//PrimaryCmpNode[@is_pycmp = False]",
51)
52def unicode_literal_eq(unicode s):
53    """
54    >>> unicode_literal_eq(ustring1)
55    True
56    >>> unicode_literal_eq((ustring1+ustring2)[:len(ustring1)])
57    True
58    >>> unicode_literal_eq(ustring2)
59    False
60    """
61    return s == u"abcdefg"
62
63@cython.test_assert_path_exists(
64    "//PrimaryCmpNode",
65    "//PrimaryCmpNode[@is_pycmp = False]",
66)
67def unicode_literal_neq(unicode s):
68    """
69    >>> unicode_literal_neq(ustring1)
70    False
71    >>> unicode_literal_neq((ustring1+ustring2)[:len(ustring1)])
72    False
73    >>> unicode_literal_neq(ustring2)
74    True
75    """
76    return s != u"abcdefg"
77
78@cython.test_assert_path_exists(
79    "//PrimaryCmpNode",
80    "//PrimaryCmpNode[@is_pycmp = False]",
81    "//CascadedCmpNode"
82)
83@cython.test_fail_if_path_exists(
84    "//CascadedCmpNode[@is_pycmp = True]",
85    "//PrimaryCmpNode[@is_pycmp = True]",
86)
87def unicode_cascade(unicode s1, unicode s2):
88    """
89    >>> unicode_cascade(ustring1, ustring1)
90    True
91    >>> unicode_cascade(ustring1, (ustring1+ustring2)[:len(ustring1)])
92    True
93    >>> unicode_cascade(ustring1, ustring2)
94    False
95    """
96    return s1 == s2 == u"abcdefg"
97
98@cython.test_assert_path_exists(
99    "//PrimaryCmpNode",
100    "//PrimaryCmpNode[@is_pycmp = False]",
101)
102def unicode_cascade_untyped_end(unicode s1, unicode s2):
103    """
104    >>> unicode_cascade_untyped_end(ustring1, ustring1)
105    True
106    >>> unicode_cascade_untyped_end(ustring1, (ustring1+ustring2)[:len(ustring1)])
107    True
108    >>> unicode_cascade_untyped_end(ustring1, ustring2)
109    False
110    """
111    return s1 == s2 == u"abcdefg" == (<object>ustring1) == ustring1
112
113@cython.test_assert_path_exists(
114    "//PrimaryCmpNode",
115    "//PrimaryCmpNode[@is_pycmp = False]",
116)
117def unicode_cascade_untyped_end_bool(unicode s1, unicode s2):
118    """
119    >>> unicode_cascade_untyped_end_bool(ustring1, ustring1)
120    True
121    >>> unicode_cascade_untyped_end_bool(ustring1, (ustring1+ustring2)[:len(ustring1)])
122    True
123    >>> unicode_cascade_untyped_end_bool(ustring1, ustring2)
124    False
125    """
126    if s1 == s2 == u"abcdefg" == (<object>ustring1) == ustring1:
127        return True
128    else:
129        return False
130
131
132# str
133
134@cython.test_assert_path_exists(
135    "//PrimaryCmpNode",
136    "//PrimaryCmpNode[@is_pycmp = False]",
137)
138def str_eq(str s1, str s2):
139    """
140    >>> str_eq(string1, string1)
141    True
142    >>> str_eq(string1+string2, string1+string2)
143    True
144    >>> str_eq(string1, string2)
145    False
146    """
147    return s1 == s2
148
149@cython.test_assert_path_exists(
150    "//PrimaryCmpNode",
151    "//PrimaryCmpNode[@is_pycmp = False]",
152)
153def str_neq(str s1, str s2):
154    """
155    >>> str_neq(string1, string1)
156    False
157    >>> str_neq(string1+string2, string1+string2)
158    False
159    >>> str_neq(string1, string2)
160    True
161    """
162    return s1 != s2
163
164@cython.test_assert_path_exists(
165    "//PrimaryCmpNode",
166    "//PrimaryCmpNode[@is_pycmp = False]",
167)
168def str_literal_eq(str s):
169    """
170    >>> str_literal_eq(string1)
171    True
172    >>> str_literal_eq((string1+string2)[:len(string1)])
173    True
174    >>> str_literal_eq(string2)
175    False
176    """
177    return s == "abcdefg"
178
179@cython.test_assert_path_exists(
180    "//PrimaryCmpNode",
181    "//PrimaryCmpNode[@is_pycmp = False]",
182)
183def str_literal_neq(str s):
184    """
185    >>> str_literal_neq(string1)
186    False
187    >>> str_literal_neq((string1+string2)[:len(string1)])
188    False
189    >>> str_literal_neq(string2)
190    True
191    """
192    return s != "abcdefg"
193
194@cython.test_assert_path_exists(
195    "//PrimaryCmpNode",
196    "//PrimaryCmpNode[@is_pycmp = False]",
197)
198@cython.test_fail_if_path_exists(
199    "//CascadedCmpNode[@is_pycmp = True]",
200    "//PrimaryCmpNode[@is_pycmp = True]",
201)
202def str_cascade(str s1, str s2):
203    """
204    >>> str_cascade(string1, string1)
205    True
206    >>> str_cascade(string1, (string1+string2)[:len(string1)])
207    True
208    >>> str_cascade(string1, string2)
209    False
210    """
211    return s1 == s2 == "abcdefg"
212
213@cython.test_assert_path_exists(
214    "//PrimaryCmpNode",
215    "//PrimaryCmpNode[@is_pycmp = False]",
216)
217def str_cascade_untyped_end(str s1, str s2):
218    """
219    >>> str_cascade_untyped_end(string1, string1)
220    True
221    >>> str_cascade_untyped_end(string1, (string1+string2)[:len(string1)])
222    True
223    >>> str_cascade_untyped_end(string1, string2)
224    False
225    """
226    return s1 == s2 == "abcdefg" == (<object>string1) == string1
227
228# bytes
229
230@cython.test_assert_path_exists(
231    "//PrimaryCmpNode",
232    "//PrimaryCmpNode[@is_pycmp = False]",
233)
234def bytes_eq(bytes s1, bytes s2):
235    """
236    >>> bytes_eq(bstring1, bstring1)
237    True
238    >>> bytes_eq(bstring1+bstring2, bstring1+bstring2)
239    True
240    >>> bytes_eq(bstring1, bstring2)
241    False
242    """
243    return s1 == s2
244
245@cython.test_assert_path_exists(
246    "//PrimaryCmpNode",
247    "//PrimaryCmpNode[@is_pycmp = False]",
248)
249def bytes_neq(bytes s1, bytes s2):
250    """
251    >>> bytes_neq(bstring1, bstring1)
252    False
253    >>> bytes_neq(bstring1+bstring2, bstring1+bstring2)
254    False
255    >>> bytes_neq(bstring1, bstring2)
256    True
257    """
258    return s1 != s2
259
260@cython.test_assert_path_exists(
261    "//PrimaryCmpNode",
262    "//PrimaryCmpNode[@is_pycmp = False]",
263)
264def bytes_literal_eq(bytes s):
265    """
266    >>> bytes_literal_eq(bstring1)
267    True
268    >>> bytes_literal_eq((bstring1+bstring2)[:len(bstring1)])
269    True
270    >>> bytes_literal_eq(bstring2)
271    False
272    """
273    return s == b"abcdefg"
274
275@cython.test_assert_path_exists(
276    "//PrimaryCmpNode",
277    "//PrimaryCmpNode[@is_pycmp = False]",
278)
279def bytes_literal_neq(bytes s):
280    """
281    >>> bytes_literal_neq(bstring1)
282    False
283    >>> bytes_literal_neq((bstring1+bstring2)[:len(bstring1)])
284    False
285    >>> bytes_literal_neq(bstring2)
286    True
287    """
288    return s != b"abcdefg"
289
290@cython.test_assert_path_exists(
291    "//PrimaryCmpNode",
292    "//PrimaryCmpNode[@is_pycmp = False]",
293)
294@cython.test_fail_if_path_exists(
295    "//CascadedCmpNode[@is_pycmp = True]",
296    "//PrimaryCmpNode[@is_pycmp = True]",
297)
298def bytes_cascade(bytes s1, bytes s2):
299    """
300    >>> bytes_cascade(bstring1, bstring1)
301    True
302    >>> bytes_cascade(bstring1, (bstring1+bstring2)[:len(bstring1)])
303    True
304    >>> bytes_cascade(bstring1, bstring2)
305    False
306    """
307    return s1 == s2 == b"abcdefg"
308
309@cython.test_assert_path_exists(
310    "//PrimaryCmpNode",
311    "//PrimaryCmpNode[@is_pycmp = False]",
312)
313def bytes_cascade_untyped_end(bytes s1, bytes s2):
314    """
315    >>> bytes_cascade_untyped_end(bstring1, bstring1)
316    True
317    >>> bytes_cascade_untyped_end(bstring1, (bstring1+bstring2)[:len(bstring1)])
318    True
319    >>> bytes_cascade_untyped_end(bstring1, bstring2)
320    False
321    """
322    return s1 == s2 == b"abcdefg" == (<object>bstring1) == bstring1
323
324
325# basestring
326
327@cython.test_assert_path_exists(
328    "//PrimaryCmpNode",
329    "//PrimaryCmpNode[@is_pycmp = False]",
330)
331def basestring_eq(basestring s1, basestring s2):
332    """
333    >>> basestring_eq(string1, string1)
334    True
335    >>> basestring_eq(string1, ustring1)
336    True
337    >>> basestring_eq(string1+string2, string1+string2)
338    True
339    >>> basestring_eq(string1+ustring2, ustring1+string2)
340    True
341    >>> basestring_eq(string1, string2)
342    False
343    >>> basestring_eq(string1, ustring2)
344    False
345    >>> basestring_eq(ustring1, string2)
346    False
347    """
348    return s1 == s2
349
350@cython.test_assert_path_exists(
351    "//PrimaryCmpNode",
352    "//PrimaryCmpNode[@is_pycmp = False]",
353)
354def basestring_neq(basestring s1, basestring s2):
355    """
356    >>> basestring_neq(string1, string1)
357    False
358    >>> basestring_neq(string1+string2, string1+string2)
359    False
360    >>> basestring_neq(string1+ustring2, ustring1+string2)
361    False
362    >>> basestring_neq(string1, string2)
363    True
364    >>> basestring_neq(string1, ustring2)
365    True
366    >>> basestring_neq(ustring1, string2)
367    True
368    """
369    return s1 != s2
370
371@cython.test_assert_path_exists(
372    "//PrimaryCmpNode",
373    "//PrimaryCmpNode[@is_pycmp = False]",
374)
375def basestring_str_literal_eq(basestring s):
376    """
377    >>> basestring_str_literal_eq(string1)
378    True
379    >>> basestring_str_literal_eq((string1+string2)[:len(string1)])
380    True
381    >>> basestring_str_literal_eq(string2)
382    False
383    """
384    return s == "abcdefg"
385
386@cython.test_assert_path_exists(
387    "//PrimaryCmpNode",
388    "//PrimaryCmpNode[@is_pycmp = False]",
389)
390def basestring_unicode_literal_eq(basestring s):
391    """
392    >>> basestring_unicode_literal_eq(string1)
393    True
394    >>> basestring_unicode_literal_eq((string1+string2)[:len(string1)])
395    True
396    >>> basestring_unicode_literal_eq(string2)
397    False
398    """
399    return s == u"abcdefg"
400
401@cython.test_assert_path_exists(
402    "//PrimaryCmpNode",
403    "//PrimaryCmpNode[@is_pycmp = False]",
404)
405def basestring_str_literal_neq(basestring s):
406    """
407    >>> basestring_str_literal_neq(string1)
408    False
409    >>> basestring_str_literal_neq((string1+string2)[:len(string1)])
410    False
411    >>> basestring_str_literal_neq(string2)
412    True
413    """
414    return s != "abcdefg"
415
416@cython.test_assert_path_exists(
417    "//PrimaryCmpNode",
418    "//PrimaryCmpNode[@is_pycmp = False]",
419)
420def basestring_unicode_literal_neq(basestring s):
421    """
422    >>> basestring_unicode_literal_neq(string1)
423    False
424    >>> basestring_unicode_literal_neq((string1+string2)[:len(string1)])
425    False
426    >>> basestring_unicode_literal_neq(string2)
427    True
428    """
429    return s != u"abcdefg"
430
431@cython.test_assert_path_exists(
432    "//PrimaryCmpNode",
433    "//PrimaryCmpNode[@is_pycmp = False]",
434    "//CascadedCmpNode[@is_pycmp = False]",
435)
436@cython.test_fail_if_path_exists(
437    "//CascadedCmpNode[@is_pycmp = True]",
438    "//PrimaryCmpNode[@is_pycmp = True]",
439)
440def basestring_cascade_str(basestring s1, basestring s2):
441    """
442    >>> basestring_cascade_str(string1, string1)
443    True
444    >>> basestring_cascade_str(string1, (string1+string2)[:len(string1)])
445    True
446    >>> basestring_cascade_str(string1, string2)
447    False
448    """
449    return s1 == s2 == "abcdefg"
450
451@cython.test_assert_path_exists(
452    "//PrimaryCmpNode",
453    "//PrimaryCmpNode[@is_pycmp = False]",
454    "//CascadedCmpNode[@is_pycmp = False]",
455)
456@cython.test_fail_if_path_exists(
457    "//CascadedCmpNode[@is_pycmp = True]",
458    "//PrimaryCmpNode[@is_pycmp = True]",
459)
460def basestring_cascade_unicode(basestring s1, basestring s2):
461    """
462    >>> basestring_cascade_unicode(string1, string1)
463    True
464    >>> basestring_cascade_unicode(ustring1, string1)
465    True
466    >>> basestring_cascade_unicode(string1, ustring1)
467    True
468    >>> basestring_cascade_unicode(string1, (string1+string2)[:len(string1)])
469    True
470    >>> basestring_cascade_unicode(string1, string2)
471    False
472    >>> basestring_cascade_unicode(ustring1, string2)
473    False
474    >>> basestring_cascade_unicode(string1, ustring2)
475    False
476    """
477    return s1 == s2 == u"abcdefg"
478
479@cython.test_assert_path_exists(
480    "//PrimaryCmpNode",
481    "//PrimaryCmpNode[@is_pycmp = False]",
482)
483def basestring_cascade_untyped_end(basestring s1, basestring s2):
484    """
485    >>> basestring_cascade_untyped_end(string1, string1)
486    True
487    >>> basestring_cascade_untyped_end(string1, (string1+string2)[:len(string1)])
488    True
489    >>> basestring_cascade_untyped_end(string1, string2)
490    False
491    """
492    return s1 == s2 == "abcdefg" == (<object>string1) == string1
493
494
495# untyped/literal comparison
496
497@cython.test_assert_path_exists(
498    "//PrimaryCmpNode",
499    "//PrimaryCmpNode[@is_pycmp = False]",
500)
501def untyped_unicode_literal_eq_bool(s):
502    """
503    >>> untyped_unicode_literal_eq_bool(string1)
504    True
505    >>> untyped_unicode_literal_eq_bool(ustring1)
506    True
507    >>> untyped_unicode_literal_eq_bool((string1+string2)[:len(string1)])
508    True
509    >>> untyped_unicode_literal_eq_bool(string2)
510    False
511    >>> untyped_unicode_literal_eq_bool(ustring2)
512    False
513    """
514    return True if s == u"abcdefg" else False
515
516@cython.test_assert_path_exists(
517    "//PrimaryCmpNode",
518    "//PrimaryCmpNode[@is_pycmp = False]",
519)
520def untyped_str_literal_eq_bool(s):
521    """
522    >>> untyped_str_literal_eq_bool(string1)
523    True
524    >>> untyped_str_literal_eq_bool(ustring1)
525    True
526    >>> untyped_str_literal_eq_bool((string1+string2)[:len(string1)])
527    True
528    >>> untyped_str_literal_eq_bool(string2)
529    False
530    >>> untyped_str_literal_eq_bool(ustring2)
531    False
532    """
533    return True if s == "abcdefg" else False
534
535@cython.test_assert_path_exists(
536    "//PrimaryCmpNode",
537    "//PrimaryCmpNode[@is_pycmp = True]",
538    "//CascadedCmpNode",
539    "//CascadedCmpNode[@is_pycmp = False]",
540)
541@cython.test_fail_if_path_exists(
542    "//CascadedCmpNode[@is_pycmp = True]",
543    "//PrimaryCmpNode[@is_pycmp = False]",
544)
545def untyped_unicode_cascade(s1, unicode s2):
546    """
547    >>> untyped_unicode_cascade(ustring1, ustring1)
548    True
549    >>> untyped_unicode_cascade(ustring1, (ustring1+ustring2)[:len(ustring1)])
550    True
551    >>> untyped_unicode_cascade(ustring1, ustring2)
552    False
553    """
554    return s1 == s2 == u"abcdefg"
555
556@cython.test_assert_path_exists(
557    "//PrimaryCmpNode",
558    "//PrimaryCmpNode[@is_pycmp = False]",
559    "//CascadedCmpNode",
560    "//CascadedCmpNode[@is_pycmp = False]",
561)
562@cython.test_fail_if_path_exists(
563    "//CascadedCmpNode[@is_pycmp = True]",
564    "//PrimaryCmpNode[@is_pycmp = True]",
565)
566def untyped_unicode_cascade_bool(s1, unicode s2):
567    """
568    >>> untyped_unicode_cascade_bool(ustring1, ustring1)
569    True
570    >>> untyped_unicode_cascade_bool(ustring1, (ustring1+ustring2)[:len(ustring1)])
571    True
572    >>> untyped_unicode_cascade_bool(ustring1, ustring2)
573    False
574    """
575    return True if s1 == s2 == u"abcdefg" else False
576
577@cython.test_assert_path_exists(
578    "//PrimaryCmpNode",
579    "//PrimaryCmpNode[@is_pycmp = True]",
580    "//CascadedCmpNode",
581#    "//CascadedCmpNode[@is_pycmp = False]",
582)
583@cython.test_fail_if_path_exists(
584    "//CascadedCmpNode[@is_pycmp = True]",
585    "//PrimaryCmpNode[@is_pycmp = False]",
586)
587def untyped_untyped_unicode_cascade_bool(s1, s2):
588    """
589    >>> untyped_untyped_unicode_cascade_bool(ustring1, ustring1)
590    True
591    >>> untyped_untyped_unicode_cascade_bool(ustring1, (ustring1+ustring2)[:len(ustring1)])
592    True
593    >>> untyped_untyped_unicode_cascade_bool(ustring1, ustring2)
594    False
595    >>> untyped_untyped_unicode_cascade_bool(string1, string2)
596    False
597    >>> untyped_untyped_unicode_cascade_bool(1, 2)
598    False
599    >>> untyped_untyped_unicode_cascade_bool(1, 1)
600    False
601    """
602    return True if s1 == s2 == u"abcdefg" else False
603
604
605# bytes/str comparison
606
607@cython.test_assert_path_exists(
608    '//CondExprNode',
609    '//CondExprNode//PrimaryCmpNode',
610    '//CondExprNode//PrimaryCmpNode[@operator = "=="]',
611    '//CondExprNode//PrimaryCmpNode[@operator = "!="]',
612)
613def literal_compare_bytes_str():
614    """
615    >>> literal_compare_bytes_str()
616    True
617    """
618    # we must not constant fold the subexpressions as the result is Py2/3 sensitive
619    return b'abc' != 'abc' if IS_PY3 else b'abc' == 'abc'
620