#!/usr/bin/env python3 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): def setUp(self): self.all_cars = get_all_car_info() def test_generator(self): generated_cars_md = generate_cars_md(self.all_cars, CARS_MD_TEMPLATE, False) 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_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`") self.assertNotIn("ev", tokens, "Use `Electric`") if "plug-in hybrid" in car.model.lower(): self.assertIn("Plug-in Hybrid", car.model, "Use correct capitalization") 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()