You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							81 lines
						
					
					
						
							3.3 KiB
						
					
					
				
			
		
		
	
	
							81 lines
						
					
					
						
							3.3 KiB
						
					
					
				| #!/usr/bin/env python3
 | |
| from collections import defaultdict
 | |
| import re
 | |
| import unittest
 | |
| 
 | |
| from selfdrive.car.car_helpers import interfaces, get_interface_attr
 | |
| from selfdrive.car.docs import CARS_MD_OUT, CARS_MD_TEMPLATE, generate_cars_md, get_all_car_info
 | |
| from selfdrive.car.docs_definitions import Column, Harness, Star
 | |
| from selfdrive.car.honda.values import CAR as HONDA
 | |
| 
 | |
| 
 | |
| class TestCarDocs(unittest.TestCase):
 | |
|   @classmethod
 | |
|   def setUpClass(cls):
 | |
|     cls.all_cars = get_all_car_info()
 | |
| 
 | |
|   def test_generator(self):
 | |
|     generated_cars_md = generate_cars_md(self.all_cars, CARS_MD_TEMPLATE)
 | |
|     with open(CARS_MD_OUT, "r") as f:
 | |
|       current_cars_md = f.read()
 | |
| 
 | |
|     self.assertEqual(generated_cars_md, current_cars_md,
 | |
|                      "Run selfdrive/car/docs.py to update the compatibility documentation")
 | |
| 
 | |
|   def test_duplicate_years(self):
 | |
|     make_model_years = defaultdict(list)
 | |
|     for car in self.all_cars:
 | |
|       with self.subTest(car_info_name=car.name):
 | |
|         make_model = (car.make, car.model)
 | |
|         for year in car.year_list:
 | |
|           self.assertNotIn(year, make_model_years[make_model], f"{car.name}: Duplicate model year")
 | |
|           make_model_years[make_model].append(year)
 | |
| 
 | |
|   def test_missing_car_info(self):
 | |
|     all_car_info_platforms = get_interface_attr("CAR_INFO", combine_brands=True).keys()
 | |
|     for platform in sorted(interfaces.keys()):
 | |
|       with self.subTest(platform=platform):
 | |
|         self.assertTrue(platform in all_car_info_platforms, "Platform: {} doesn't exist in CarInfo".format(platform))
 | |
| 
 | |
|   def test_naming_conventions(self):
 | |
|     # Asserts market-standard car naming conventions by brand
 | |
|     for car in self.all_cars:
 | |
|       with self.subTest(car=car):
 | |
|         tokens = car.model.lower().split(" ")
 | |
|         if car.car_name == "hyundai":
 | |
|           self.assertNotIn("phev", tokens, "Use `Plug-in Hybrid`")
 | |
|           self.assertNotIn("hev", tokens, "Use `Hybrid`")
 | |
|           if "plug-in hybrid" in car.model.lower():
 | |
|             self.assertIn("Plug-in Hybrid", car.model, "Use correct capitalization")
 | |
|           if car.make != "Kia":
 | |
|             self.assertNotIn("ev", tokens, "Use `Electric`")
 | |
|         elif car.car_name == "toyota":
 | |
|           if "rav4" in tokens:
 | |
|             self.assertIn("RAV4", car.model, "Use correct capitalization")
 | |
| 
 | |
|   def test_torque_star(self):
 | |
|     # Asserts brand-specific assumptions around steering torque star
 | |
|     for car in self.all_cars:
 | |
|       with self.subTest(car=car):
 | |
|         # honda sanity check, it's the definition of a no torque star
 | |
|         if car.car_fingerprint in (HONDA.ACCORD, HONDA.CIVIC, HONDA.CRV, HONDA.ODYSSEY, HONDA.PILOT):
 | |
|           self.assertEqual(car.row[Column.STEERING_TORQUE], Star.EMPTY, f"{car.name} has full torque star")
 | |
|         elif car.car_name in ("toyota", "hyundai"):
 | |
|           self.assertNotEqual(car.row[Column.STEERING_TORQUE], Star.EMPTY, f"{car.name} has no torque star")
 | |
| 
 | |
|   def test_year_format(self):
 | |
|     for car in self.all_cars:
 | |
|       with self.subTest(car=car):
 | |
|         self.assertIsNone(re.search(r"\d{4}-\d{4}", car.name), f"Format years correctly: {car.name}")
 | |
| 
 | |
|   def test_harnesses(self):
 | |
|     for car in self.all_cars:
 | |
|       with self.subTest(car=car):
 | |
|         if car.name == "comma body":
 | |
|           raise unittest.SkipTest
 | |
| 
 | |
|         self.assertNotIn(car.harness, [None, Harness.none], f"Need to specify car harness: {car.name}")
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|   unittest.main()
 | |
| 
 |