mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			104 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# SPDX-License-Identifier: MIT
 | 
						|
# SPDX-FileCopyrightText: 2021 Taneli Hukkinen
 | 
						|
# Licensed to PSF under a Contributor Agreement.
 | 
						|
 | 
						|
import copy
 | 
						|
import datetime
 | 
						|
from decimal import Decimal as D
 | 
						|
from pathlib import Path
 | 
						|
import sys
 | 
						|
import tempfile
 | 
						|
import unittest
 | 
						|
 | 
						|
from . import tomllib
 | 
						|
 | 
						|
 | 
						|
class TestMiscellaneous(unittest.TestCase):
 | 
						|
    def test_load(self):
 | 
						|
        content = "one=1 \n two='two' \n arr=[]"
 | 
						|
        expected = {"one": 1, "two": "two", "arr": []}
 | 
						|
        with tempfile.TemporaryDirectory() as tmp_dir_path:
 | 
						|
            file_path = Path(tmp_dir_path) / "test.toml"
 | 
						|
            file_path.write_text(content)
 | 
						|
 | 
						|
            with open(file_path, "rb") as bin_f:
 | 
						|
                actual = tomllib.load(bin_f)
 | 
						|
        self.assertEqual(actual, expected)
 | 
						|
 | 
						|
    def test_incorrect_load(self):
 | 
						|
        content = "one=1"
 | 
						|
        with tempfile.TemporaryDirectory() as tmp_dir_path:
 | 
						|
            file_path = Path(tmp_dir_path) / "test.toml"
 | 
						|
            file_path.write_text(content)
 | 
						|
 | 
						|
            with open(file_path, "r") as txt_f:
 | 
						|
                with self.assertRaises(TypeError):
 | 
						|
                    tomllib.load(txt_f)  # type: ignore[arg-type]
 | 
						|
 | 
						|
    def test_parse_float(self):
 | 
						|
        doc = """
 | 
						|
              val=0.1
 | 
						|
              biggest1=inf
 | 
						|
              biggest2=+inf
 | 
						|
              smallest=-inf
 | 
						|
              notnum1=nan
 | 
						|
              notnum2=-nan
 | 
						|
              notnum3=+nan
 | 
						|
              """
 | 
						|
        obj = tomllib.loads(doc, parse_float=D)
 | 
						|
        expected = {
 | 
						|
            "val": D("0.1"),
 | 
						|
            "biggest1": D("inf"),
 | 
						|
            "biggest2": D("inf"),
 | 
						|
            "smallest": D("-inf"),
 | 
						|
            "notnum1": D("nan"),
 | 
						|
            "notnum2": D("-nan"),
 | 
						|
            "notnum3": D("nan"),
 | 
						|
        }
 | 
						|
        for k, expected_val in expected.items():
 | 
						|
            actual_val = obj[k]
 | 
						|
            self.assertIsInstance(actual_val, D)
 | 
						|
            if actual_val.is_nan():
 | 
						|
                self.assertTrue(expected_val.is_nan())
 | 
						|
            else:
 | 
						|
                self.assertEqual(actual_val, expected_val)
 | 
						|
 | 
						|
    def test_deepcopy(self):
 | 
						|
        doc = """
 | 
						|
              [bliibaa.diibaa]
 | 
						|
              offsettime=[1979-05-27T00:32:00.999999-07:00]
 | 
						|
              """
 | 
						|
        obj = tomllib.loads(doc)
 | 
						|
        obj_copy = copy.deepcopy(obj)
 | 
						|
        self.assertEqual(obj_copy, obj)
 | 
						|
        expected_obj = {
 | 
						|
            "bliibaa": {
 | 
						|
                "diibaa": {
 | 
						|
                    "offsettime": [
 | 
						|
                        datetime.datetime(
 | 
						|
                            1979,
 | 
						|
                            5,
 | 
						|
                            27,
 | 
						|
                            0,
 | 
						|
                            32,
 | 
						|
                            0,
 | 
						|
                            999999,
 | 
						|
                            tzinfo=datetime.timezone(datetime.timedelta(hours=-7)),
 | 
						|
                        )
 | 
						|
                    ]
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        self.assertEqual(obj_copy, expected_obj)
 | 
						|
 | 
						|
    def test_inline_array_recursion_limit(self):
 | 
						|
        # 465 with default recursion limit
 | 
						|
        nest_count = int(sys.getrecursionlimit() * 0.465)
 | 
						|
        recursive_array_toml = "arr = " + nest_count * "[" + nest_count * "]"
 | 
						|
        tomllib.loads(recursive_array_toml)
 | 
						|
 | 
						|
    def test_inline_table_recursion_limit(self):
 | 
						|
        # 310 with default recursion limit
 | 
						|
        nest_count = int(sys.getrecursionlimit() * 0.31)
 | 
						|
        recursive_table_toml = nest_count * "key = {" + nest_count * "}"
 | 
						|
        tomllib.loads(recursive_table_toml)
 |