mirror of
https://github.com/Nuitka/Nuitka.git
synced 2026-02-01 11:33:19 +01:00
114 lines
4.6 KiB
Django/Jinja
114 lines
4.6 KiB
Django/Jinja
{# Copyright 2025, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file #}
|
|
|
|
# This test does check operations in optimizable and not optimizable forms
|
|
# to check for proper errors, exceptions, etc.
|
|
|
|
# While we use that for comparison code, no need to compile that.
|
|
# nuitka-project: --nofollow-import-to=nuitka
|
|
|
|
from __future__ import print_function
|
|
|
|
|
|
import os
|
|
import sys
|
|
|
|
# Find nuitka package relative to us.
|
|
sys.path.insert(
|
|
0,
|
|
os.path.normpath(
|
|
os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..")
|
|
),
|
|
)
|
|
from nuitka.tools.testing.Common import checkReferenceCount
|
|
|
|
# isort:start
|
|
|
|
# Function to hide type because it is not seen through
|
|
def forgetType(value):
|
|
return value
|
|
|
|
# To trigger hashing errors
|
|
unhashable = []
|
|
|
|
{% for dict_method_name in dict_method_names %}
|
|
|
|
{% if dict_method_name == "get" %}
|
|
{% set method_arg_variants = ["1", "5", "[]", "unhashable", "1,7", "6,9"] %}
|
|
{% elif dict_method_name == "has_key" %}
|
|
{% set method_arg_variants = ["1", "5", "[]", "unhashable"] %}
|
|
{% elif dict_method_name == "setdefault" %}
|
|
{% set method_arg_variants = ["1", "5", "[]", "unhashable", "1,7", "unhashable,9"] %}
|
|
{% elif dict_method_name == "pop" %}
|
|
{% set method_arg_variants = ["1", "5", "[]", "unhashable", "1,7", "unhashable,9"] %}
|
|
{% elif dict_method_name == "pop" %}
|
|
{% set method_arg_variants = ["1", "5", "[]", "unhashable", "1,7", "unhashable,9"] %}
|
|
{% elif dict_method_name == "update" %}
|
|
{% set method_arg_variants = ["", "1", "[]", "{a:unhashable}, b=1, c=2"] %}
|
|
{% else %}
|
|
{% set method_arg_variants = [""] %}
|
|
{% endif %}
|
|
|
|
{% if dict_method_name in ("setdefault", "pop", "popitem", "update") %}
|
|
{% set input_value = "dict(kwargs)" %}
|
|
{% else %}
|
|
{% set input_value = "kwargs" %}
|
|
{% endif %}
|
|
|
|
{% for method_args in method_arg_variants %}
|
|
|
|
{% set left_1 = "{1:2, 2:3}" %}
|
|
{% set left_2 = "{2:3, 3:4}" %}
|
|
|
|
{% set operation_id = "check%s%s" % (dict_method_name.title(), (""if loop.index == 0 else loop.index)) %}
|
|
|
|
def {{operation_id}}(cond = None, **kwargs):
|
|
# First value type, which we expect to be compile time recognized.
|
|
|
|
try:
|
|
x = kwargs.{{dict_method_name}}({{method_args}})
|
|
except Exception as e: # pylint: disable=broad-except
|
|
if cond is not None:
|
|
print("dict.{{dict_method_name}}({{method_args.count(",")+1 if method_args else 0}} args) compile time occurred:", repr(e))
|
|
else:
|
|
if cond is not None:
|
|
print("dict.{{dict_method_name}}({{method_args.count(",")+1 if method_args else 0}} args) compile time result:", type(x), x)
|
|
|
|
# Now the branch may make things less clear for mixed types and
|
|
# also require the operation to be checked at run time.
|
|
left = {{left_1}} if cond else {{left_2}}
|
|
|
|
try:
|
|
# We expect this to be compile time error checked still.
|
|
x = left.{{dict_method_name}}({{method_args}})
|
|
except Exception as e: # pylint: disable=broad-except
|
|
if cond is not None:
|
|
print("dict.{{dict_method_name}}({{method_args.count(",")+1 if method_args else 0}} args) runtime occurred:", repr(e))
|
|
else:
|
|
if cond is not None:
|
|
print("dict.{{dict_method_name}}({{method_args.count(",")+1 if method_args else 0}} args) runtime result:", type(x), x)
|
|
|
|
{{operation_id}}(1, a=2, b=1)
|
|
{{operation_id}}(0, a=2, b=1)
|
|
|
|
checkReferenceCount({{operation_id}})
|
|
|
|
{% endfor %}
|
|
{% endfor %}
|
|
|
|
{# Python test originally created or extracted from other peoples work. The #}
|
|
{# parts from me are licensed as below. It is at least Free Software where #}
|
|
{# it's copied from other people. In these cases, that will normally be #}
|
|
{# indicated. #}
|
|
{# #}
|
|
{# Licensed under the Apache License, Version 2.0 (the "License"); #}
|
|
{# you may not use this file except in compliance with the License. #}
|
|
{# You may obtain a copy of the License at #}
|
|
{# #}
|
|
{# http://www.apache.org/licenses/LICENSE-2.0 #}
|
|
{# #}
|
|
{# Unless required by applicable law or agreed to in writing, software #}
|
|
{# distributed under the License is distributed on an "AS IS" BASIS, #}
|
|
{# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #}
|
|
{# See the License for the specific language governing permissions and #}
|
|
{# limitations under the License. #}
|