From b611d2aef4056c318e460bd12ad3de6b4014d6cb Mon Sep 17 00:00:00 2001 From: sharkdp Date: Sun, 15 Mar 2020 14:14:01 +0100 Subject: [PATCH] Add no-duplicate-extensions unit test --- tests/no_duplicate_extensions.rs | 35 ++++++++++++++++++++++++++++++++ tests/syntax_detection.rs | 11 ++++++++++ 2 files changed, 46 insertions(+) create mode 100644 tests/no_duplicate_extensions.rs diff --git a/tests/no_duplicate_extensions.rs b/tests/no_duplicate_extensions.rs new file mode 100644 index 00000000..ef9e76a9 --- /dev/null +++ b/tests/no_duplicate_extensions.rs @@ -0,0 +1,35 @@ +use std::collections::HashSet; + +use bat::assets::HighlightingAssets; + +#[test] +fn no_duplicate_extensions() { + const KNOWN_EXCEPTIONS: &[&'static str] = &[ + // The '.h' extension currently appears in multiple syntaxes: C, C++, Objective C, + // Objective C++ + "h", + // In addition to the standard Haskell syntax in 'Packages', we also ship the 'Cabal' + // syntax which comes with a "Haskell (improved)" syntax. + "hs", + // In addition to the standard JavaScript syntax in 'Packages', we also ship the + // 'Javascript (Babel)' syntax. + "js", + // The "Ruby Haml" syntax also comes with a '.sass' extension. However, we make sure + // that 'sass' is mapped to the 'Sass' syntax. + "sass", + ]; + + let assets = HighlightingAssets::new(); + + let mut extensions = HashSet::new(); + + for syntax in assets.syntax_set.syntaxes() { + for extension in &syntax.file_extensions { + assert!( + KNOWN_EXCEPTIONS.contains(&extension.as_str()) || extensions.insert(extension), + "File extension / pattern \"{}\" appears twice in the syntax set", + extension + ); + } + } +} diff --git a/tests/syntax_detection.rs b/tests/syntax_detection.rs index 23a52de9..ac155959 100644 --- a/tests/syntax_detection.rs +++ b/tests/syntax_detection.rs @@ -57,6 +57,17 @@ fn syntax_detection_basic() { assert_eq!(test.syntax_name("PKGBUILD"), "Bourne Again Shell (bash)"); } +#[test] +fn syntax_detection_well_defined_mapping_for_duplicate_extensions() { + let test = SyntaxDetectionTest::new(); + + assert_eq!(test.syntax_name("test.sass"), "Sass"); + // TODO: make these tests pass: + // assert_eq!(test.syntax_name("test.h"), "C"); + // assert_eq!(test.syntax_name("test.hs"), "Haskell (Improved)"); + // assert_eq!(test.syntax_name("test.js"), "JavaScript (Babel)"); +} + #[test] fn syntax_detection_first_line() { let test = SyntaxDetectionTest::new();