summaryrefslogtreecommitdiffstats
path: root/tests/testsuite/git_branch.rs
diff options
context:
space:
mode:
authorTitouan Vervack <tivervac@gmail.com>2019-09-02 21:56:59 +0200
committerMatan Kushner <hello@matchai.me>2019-09-02 15:56:59 -0400
commit59e8b1fc927eff4874ea44e381953b86ffc8af7b (patch)
tree074535b48421d7d4ea2c148e751bb02e99e413f5 /tests/testsuite/git_branch.rs
parentf8929c2d7d37ef1a511ed2b941ca9b1644f666c7 (diff)
feat: added truncation_length/symbol to git_branch (#268)
Git branches can become very long (e.g. gitlab auto-generated branch names), thus it would be nice to be able to truncate them to keep your prompt lenght in line. This patch adds two new options to the git_branch module: * truncation_length: The amount of graphemes to of a gitbranch to truncate to * truncation_symbol: The symbol that should be used to indicate that a branch name was trunctated To be able to correctly work with UTF-8 graphemes, unicode-segmentation was added as a dependency.
Diffstat (limited to 'tests/testsuite/git_branch.rs')
-rw-r--r--tests/testsuite/git_branch.rs168
1 files changed, 168 insertions, 0 deletions
diff --git a/tests/testsuite/git_branch.rs b/tests/testsuite/git_branch.rs
new file mode 100644
index 000000000..16d889b4d
--- /dev/null
+++ b/tests/testsuite/git_branch.rs
@@ -0,0 +1,168 @@
+use ansi_term::Color;
+use git2::Repository;
+use std::env;
+use std::io;
+use std::process::Command;
+
+use crate::common::{self, TestCommand};
+
+#[test]
+fn test_changed_truncation_symbol() -> io::Result<()> {
+ test_truncate_length_with_config(
+ "1337_hello_world",
+ 15,
+ "1337_hello_worl",
+ "%",
+ "truncation_symbol = \"%\"",
+ )
+}
+
+#[test]
+fn test_no_truncation_symbol() -> io::Result<()> {
+ test_truncate_length_with_config(
+ "1337_hello_world",
+ 15,
+ "1337_hello_worl",
+ "",
+ "truncation_symbol = \"\"",
+ )
+}
+
+#[test]
+fn test_multi_char_truncation_symbol() -> io::Result<()> {
+ test_truncate_length_with_config(
+ "1337_hello_world",
+ 15,
+ "1337_hello_worl",
+ "a",
+ "truncation_symbol = \"apple\"",
+ )
+}
+
+#[test]
+fn test_ascii_boundary_below() -> io::Result<()> {
+ test_truncate_length("1337_hello_world", 15, "1337_hello_worl", "…")
+}
+
+#[test]
+fn test_ascii_boundary_on() -> io::Result<()> {
+ test_truncate_length("1337_hello_world", 16, "1337_hello_world", "")
+}
+
+#[test]
+fn test_ascii_boundary_above() -> io::Result<()> {
+ test_truncate_length("1337_hello_world", 17, "1337_hello_world", "")
+}
+
+#[test]
+fn test_one() -> io::Result<()> {
+ test_truncate_length("1337_hello_world", 1, "1", "…")
+}
+
+#[test]
+fn test_zero() -> io::Result<()> {
+ test_truncate_length("1337_hello_world", 0, "1337_hello_world", "")
+}
+
+#[test]
+fn test_negative() -> io::Result<()> {
+ test_truncate_length("1337_hello_world", -1, "1337_hello_world", "")
+}
+
+#[test]
+fn test_hindi_truncation() -> io::Result<()> {
+ test_truncate_length("नमस्ते", 3, "नमस्", "…")
+}
+
+#[test]
+fn test_hindi_truncation2() -> io::Result<()> {
+ test_truncate_length("नमस्त", 3, "नमस्", "…")
+}
+
+#[test]
+fn test_japanese_truncation() -> io::Result<()> {
+ test_truncate_length("がんばってね", 4, "がんばっ", "…")
+}
+
+fn test_truncate_length(
+ branch_name: &str,
+ truncate_length: i64,
+ expected_name: &str,
+ truncation_symbol: &str,
+) -> io::Result<()> {
+ return test_truncate_length_with_config(
+ branch_name,
+ truncate_length,
+ expected_name,
+ truncation_symbol,
+ "",
+ );
+}
+
+fn test_truncate_length_with_config(
+ branch_name: &str,
+ truncate_length: i64,
+ expected_name: &str,
+ truncation_symbol: &str,
+ config_options: &str,
+) -> io::Result<()> {
+ let fixture_repo_dir = create_fixture_repo()?;
+ let repo_dir = common::new_tempdir()?.path().join("rocket");
+
+ Repository::clone(fixture_repo_dir.to_str().unwrap(), &repo_dir.as_path()).unwrap();
+ Command::new("git")
+ .args(&["checkout", "-b", branch_name])
+ .current_dir(repo_dir.as_path())
+ .output()?;
+
+ let output = common::render_module("git_branch")
+ .use_config(
+ toml::from_str(&format!(
+ "
+ [git_branch]
+ truncation_length = {}
+ {}
+ ",
+ truncate_length, config_options
+ ))
+ .unwrap(),
+ )
+ .arg("--path")
+ .arg(repo_dir)
+ .output()?;
+ let actual = String::from_utf8(output.stdout).unwrap();
+
+ let expected = format!(
+ "on {} ",
+ Color::Purple
+ .bold()
+ .paint(format!("\u{e0a0} {}{}", expected_name, truncation_symbol)),
+ );
+ assert_eq!(expected, actual);
+ Ok(())
+}
+
+fn create_fixture_repo() -> io::Result<std::path::PathBuf> {
+ let fixture_repo_dir = common::new_tempdir()?.path().join("fixture");
+ let fixture = env::current_dir()?.join("tests/fixtures/rocket.bundle");
+
+ Command::new("git")
+ .args(&["config", "--global", "user.email", "starship@example.com"])
+ .output()?;
+
+ Command::new("git")
+ .args(&["config", "--global", "user.name", "starship"])
+ .output()?;
+
+ Command::new("git")
+ .args(&[
+ "clone",
+ "-b",
+ "master",
+ &fixture.to_str().unwrap(),
+ fixture_repo_dir.to_str().unwrap(),
+ ])
+ .output()?;
+
+ Ok(fixture_repo_dir)
+}