diff --git a/crates/tabby/src/serve/completions/prompt.rs b/crates/tabby/src/serve/completions/prompt.rs index ba9fe94..6c827c5 100644 --- a/crates/tabby/src/serve/completions/prompt.rs +++ b/crates/tabby/src/serve/completions/prompt.rs @@ -200,3 +200,156 @@ lazy_static! { static ref LANGUAGE_LINE_COMMENT_CHAR: HashMap<&'static str, &'static str> = HashMap::from([("python", "#"), ("rust", "//"),]); } + +#[cfg(test)] +mod tests { + use super::*; + + fn create_prompt_builder(with_template: bool) -> PromptBuilder { + let prompt_template = if with_template { + // Init prompt builder with codellama prompt template + Some("
 {prefix} {suffix} ".into())
+        } else {
+            None
+        };
+
+        // Init prompt builder with prompt rewrite disabled.
+        PromptBuilder::new(prompt_template, false)
+    }
+
+    #[test]
+    fn test_prompt_template() {
+        let pb = create_prompt_builder(true);
+
+        // Rewrite disabled, so the language doesn't matter.
+        let language = "python";
+
+        // Test w/ prefix, w/ suffix.
+        {
+            let segments = Segments {
+                prefix: "this is some prefix".into(),
+                suffix: Some("this is some suffix".into()),
+            };
+            assert_eq!(
+                pb.build(language, segments),
+                "
 this is some prefix this is some suffix "
+            );
+        }
+
+        // Test w/ prefix, w/o suffix.
+        {
+            let segments = Segments {
+                prefix: "this is some prefix".into(),
+                suffix: None,
+            };
+            assert_eq!(
+                pb.build(language, segments),
+                "
 this is some prefix \n "
+            );
+        }
+
+        // Test w/ prefix, w/ empty suffix.
+        {
+            let segments = Segments {
+                prefix: "this is some prefix".into(),
+                suffix: Some("".into()),
+            };
+            assert_eq!(
+                pb.build(language, segments),
+                "
 this is some prefix  "
+            );
+        }
+
+        // Test w/ empty prefix, w/ suffix.
+        {
+            let segments = Segments {
+                prefix: "".into(),
+                suffix: Some("this is some suffix".into()),
+            };
+            assert_eq!(
+                pb.build(language, segments),
+                "
  this is some suffix "
+            );
+        }
+
+        // Test w/ empty prefix, w/o suffix.
+        {
+            let segments = Segments {
+                prefix: "".into(),
+                suffix: None,
+            };
+            assert_eq!(pb.build(language, segments), "
  \n ");
+        }
+
+        // Test w/ emtpy prefix, w/ empty suffix.
+        {
+            let segments = Segments {
+                prefix: "".into(),
+                suffix: Some("".into()),
+            };
+            assert_eq!(pb.build(language, segments), "
   ");
+        }
+    }
+
+    #[test]
+    fn test_no_prompt_template() {
+        let pb = create_prompt_builder(false);
+
+        // Rewrite disabled, so the language doesn't matter.
+        let language = "python";
+
+        // Test w/ prefix, w/ suffix.
+        {
+            let segments = Segments {
+                prefix: "this is some prefix".into(),
+                suffix: Some("this is some suffix".into()),
+            };
+            assert_eq!(pb.build(language, segments), "this is some prefix");
+        }
+
+        // Test w/ prefix, w/o suffix.
+        {
+            let segments = Segments {
+                prefix: "this is some prefix".into(),
+                suffix: None,
+            };
+            assert_eq!(pb.build(language, segments), "this is some prefix");
+        }
+
+        // Test w/ prefix, w/ empty suffix.
+        {
+            let segments = Segments {
+                prefix: "this is some prefix".into(),
+                suffix: Some("".into()),
+            };
+            assert_eq!(pb.build(language, segments), "this is some prefix");
+        }
+
+        // Test w/ empty prefix, w/ suffix.
+        {
+            let segments = Segments {
+                prefix: "".into(),
+                suffix: Some("this is some suffix".into()),
+            };
+            assert_eq!(pb.build(language, segments), "");
+        }
+
+        // Test w/ empty prefix, w/o suffix.
+        {
+            let segments = Segments {
+                prefix: "".into(),
+                suffix: None,
+            };
+            assert_eq!(pb.build(language, segments), "");
+        }
+
+        // Test w/ empty prefix, w/ empty suffix.
+        {
+            let segments = Segments {
+                prefix: "".into(),
+                suffix: Some("".into()),
+            };
+            assert_eq!(pb.build(language, segments), "");
+        }
+    }
+}