mirror of
				https://github.com/XiaoMi/ha_xiaomi_home.git
				synced 2025-10-31 17:32:20 +08:00 
			
		
		
		
	feat: first commit
This commit is contained in:
		
							
								
								
									
										41
									
								
								custom_components/xiaomi_home/test/json_format.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								custom_components/xiaomi_home/test/json_format.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| """Check if a file is a valid JSON file. | ||||
|  | ||||
| Usage: | ||||
| python json_check.py [JSON file path] | ||||
|  | ||||
| Example: | ||||
| python json_check.py multi_lang.json | ||||
| """ | ||||
| import argparse | ||||
| import json | ||||
| import sys | ||||
| import os | ||||
|  | ||||
| def check_json_file(file_path): | ||||
|     try: | ||||
|         with open(file_path, "r", encoding="utf-8") as file: | ||||
|             json.load(file) | ||||
|             return True | ||||
|     except FileNotFoundError: | ||||
|         print(file_path, "is not found.") | ||||
|         return False | ||||
|     except json.JSONDecodeError: | ||||
|         print(file_path, "is not a valid JSON file.") | ||||
|         return False | ||||
|  | ||||
| def main(): | ||||
|     parser = argparse.ArgumentParser( | ||||
|         description="Check if a file is a valid JSON file.") | ||||
|     parser.add_argument("file_path", help="JSON file path") | ||||
|     args = parser.parse_args() | ||||
|     script_name = os.path.basename(__file__) | ||||
|     file_name = os.path.basename(args.file_path) | ||||
|  | ||||
|     if not check_json_file(args.file_path): | ||||
|         print(args.file_path, script_name, "FAIL") | ||||
|         sys.exit(1) | ||||
|  | ||||
|     print(script_name, file_name, "PASS") | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||
							
								
								
									
										149
									
								
								custom_components/xiaomi_home/test/rule_format.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								custom_components/xiaomi_home/test/rule_format.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,149 @@ | ||||
| """Check if conversion rules are valid. | ||||
|  | ||||
| The files to be checked are in the directory of ../miot/specs/ | ||||
| To run this script, PYTHONPATH must be set first. | ||||
| See test_all.sh for the usage. | ||||
|  | ||||
| You can run all tests by running: | ||||
| ``` | ||||
| ./test_all.sh | ||||
| ``` | ||||
| """ | ||||
| import sys | ||||
| import os | ||||
| import json | ||||
|  | ||||
| def load_json(file_path: str) -> dict: | ||||
|     """Load json file.""" | ||||
|     with open(file_path, "r", encoding="utf-8") as file: | ||||
|         data = json.load(file) | ||||
|         return data | ||||
|  | ||||
| def dict_str_str(d: dict) -> bool: | ||||
|     """restricted format: dict[str, str]""" | ||||
|     if not isinstance(d, dict): | ||||
|         return False | ||||
|     for k, v in d.items(): | ||||
|         if not isinstance(k, str) or not isinstance(v, str): | ||||
|             return False | ||||
|     return True | ||||
|  | ||||
| def dict_str_dict(d: dict) -> bool: | ||||
|     """restricted format: dict[str, dict]""" | ||||
|     if not isinstance(d, dict): | ||||
|         return False | ||||
|     for k, v in d.items(): | ||||
|         if not isinstance(k, str) or not isinstance(v, dict): | ||||
|             return False | ||||
|     return True | ||||
|  | ||||
| def nested_2_dict_str_str(d: dict) -> bool: | ||||
|     """restricted format: dict[str, dict[str, str]]""" | ||||
|     if not dict_str_dict(d): | ||||
|         return False | ||||
|     for v in d.values(): | ||||
|         if not dict_str_str(v): | ||||
|             return False | ||||
|     return True | ||||
|  | ||||
| def nested_3_dict_str_str(d: dict) -> bool: | ||||
|     """restricted format: dict[str, dict[str, dict[str, str]]]""" | ||||
|     if not dict_str_dict(d): | ||||
|         return False | ||||
|     for v in d.values(): | ||||
|         if not nested_2_dict_str_str(v): | ||||
|             return False | ||||
|     return True | ||||
|  | ||||
| def spec_filter(d: dict) -> bool: | ||||
|     """restricted format: dict[str, dict[str, list<str>]]""" | ||||
|     if not dict_str_dict(d): | ||||
|         return False | ||||
|     for value in d.values(): | ||||
|         for k, v in value.items(): | ||||
|             if not isinstance(k, str) or not isinstance(v, list): | ||||
|                 return False | ||||
|             if not all(isinstance(i, str) for i in v): | ||||
|                 return False | ||||
|     return True | ||||
|  | ||||
| def bool_trans(d: dict) -> bool: | ||||
|     """dict[str,  dict[str, str] | dict[str, dict[str, str]] ]""" | ||||
|     if not isinstance(d, dict): | ||||
|         return False | ||||
|     if "data" not in d or "translate" not in d: | ||||
|         return False | ||||
|     if not dict_str_str(d["data"]): | ||||
|         return False | ||||
|     if not nested_3_dict_str_str(d["translate"]): | ||||
|         return False | ||||
|  | ||||
|     return True | ||||
|  | ||||
|  | ||||
| def main(): | ||||
|     script_name = os.path.basename(__file__) | ||||
|  | ||||
|     source_dir = "../miot/specs" | ||||
|     if not bool_trans(load_json(f"{source_dir}/bool_trans.json")): | ||||
|         print(script_name, "bool_trans FAIL") | ||||
|         sys.exit(1) | ||||
|     if not nested_3_dict_str_str(load_json(f"{source_dir}/multi_lang.json")): | ||||
|         print(script_name, "multi_lang FAIL") | ||||
|         sys.exit(1) | ||||
|     if not spec_filter(load_json(f"{source_dir}/spec_filter.json")): | ||||
|         print(script_name, "spec_filter FAIL") | ||||
|         sys.exit(1) | ||||
|     if not nested_2_dict_str_str(load_json( | ||||
|         f"{source_dir}/std_ex_actions.json")): | ||||
|         print(script_name, "std_ex_actions.json FAIL") | ||||
|         sys.exit(1) | ||||
|     if not nested_2_dict_str_str(load_json( | ||||
|         f"{source_dir}/std_ex_devices.json")): | ||||
|         print(script_name, "std_ex_devices.json FAIL") | ||||
|         sys.exit(1) | ||||
|     if not nested_2_dict_str_str(load_json(f"{source_dir}/std_ex_events.json")): | ||||
|         print(script_name, "std_ex_events.json FAIL") | ||||
|         sys.exit(1) | ||||
|     if not nested_2_dict_str_str(load_json( | ||||
|         f"{source_dir}/std_ex_properties.json")): | ||||
|         print(script_name, "std_ex_properties.json FAIL") | ||||
|         sys.exit(1) | ||||
|     if not nested_2_dict_str_str(load_json( | ||||
|         f"{source_dir}/std_ex_services.json")): | ||||
|         print(script_name, "std_ex_services.json FAIL") | ||||
|         sys.exit(1) | ||||
|     if not nested_2_dict_str_str(load_json(f"{source_dir}/std_ex_values.json")): | ||||
|         print(script_name, "std_ex_values.json FAIL") | ||||
|         sys.exit(1) | ||||
|  | ||||
|     source_dir = "../miot/i18n" | ||||
|     if not nested_3_dict_str_str(load_json(f"{source_dir}/de.json")): | ||||
|         print(script_name, "i18n de.json FAIL") | ||||
|         sys.exit(1) | ||||
|     if not nested_3_dict_str_str(load_json(f"{source_dir}/en.json")): | ||||
|         print(script_name, "i18n en.json FAIL") | ||||
|         sys.exit(1) | ||||
|     if not nested_3_dict_str_str(load_json(f"{source_dir}/es.json")): | ||||
|         print(script_name, "i18n es.json FAIL") | ||||
|         sys.exit(1) | ||||
|     if not nested_3_dict_str_str(load_json(f"{source_dir}/fr.json")): | ||||
|         print(script_name, "i18n fr.json FAIL") | ||||
|         sys.exit(1) | ||||
|     if not nested_3_dict_str_str(load_json(f"{source_dir}/ja.json")): | ||||
|         print(script_name, "i18n ja.json FAIL") | ||||
|         sys.exit(1) | ||||
|     if not nested_3_dict_str_str(load_json(f"{source_dir}/ru.json")): | ||||
|         print(script_name, "i18n ru.json FAIL") | ||||
|         sys.exit(1) | ||||
|     if not nested_3_dict_str_str(load_json(f"{source_dir}/zh-Hans.json")): | ||||
|         print(script_name, "i18n zh-Hans.json FAIL") | ||||
|         sys.exit(1) | ||||
|     if not nested_3_dict_str_str(load_json(f"{source_dir}/zh-Hant.json")): | ||||
|         print(script_name, "i18n zh-Hant.json FAIL") | ||||
|         sys.exit(1) | ||||
|  | ||||
|     print(script_name, "PASS") | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||
							
								
								
									
										35
									
								
								custom_components/xiaomi_home/test/test_all.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										35
									
								
								custom_components/xiaomi_home/test/test_all.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| set -e | ||||
|  | ||||
| # Get the script path. | ||||
| script_path=$(dirname "$0") | ||||
| # Change to the script path. | ||||
| cd "$script_path" | ||||
| # Set PYTHONPATH. | ||||
| cd .. | ||||
| export PYTHONPATH=`pwd` | ||||
| echo "PYTHONPATH=$PYTHONPATH" | ||||
| cd - | ||||
|  | ||||
| # Run the tests. | ||||
| export source_dir="../miot/specs" | ||||
| python3 json_format.py $source_dir/bool_trans.json | ||||
| python3 json_format.py $source_dir/multi_lang.json | ||||
| python3 json_format.py $source_dir/spec_filter.json | ||||
| python3 json_format.py $source_dir/std_ex_actions.json | ||||
| python3 json_format.py $source_dir/std_ex_devices.json | ||||
| python3 json_format.py $source_dir/std_ex_events.json | ||||
| python3 json_format.py $source_dir/std_ex_properties.json | ||||
| python3 json_format.py $source_dir/std_ex_services.json | ||||
| python3 json_format.py $source_dir/std_ex_values.json | ||||
| export source_dir="../miot/i18n" | ||||
| python3 json_format.py $source_dir/de.json | ||||
| python3 json_format.py $source_dir/en.json | ||||
| python3 json_format.py $source_dir/es.json | ||||
| python3 json_format.py $source_dir/fr.json | ||||
| python3 json_format.py $source_dir/ja.json | ||||
| python3 json_format.py $source_dir/ru.json | ||||
| python3 json_format.py $source_dir/zh-Hans.json | ||||
| python3 json_format.py $source_dir/zh-Hant.json | ||||
| python3 rule_format.py | ||||
		Reference in New Issue
	
	Block a user