Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions base/src/test/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ mod test_fn_exact;
mod test_fn_financial;
mod test_fn_formulatext;
mod test_fn_if;
mod test_fn_left_right_mid_lower;
mod test_fn_maxifs;
mod test_fn_minifs;
mod test_fn_or_xor;
Expand Down
113 changes: 113 additions & 0 deletions base/src/test/test_fn_left_right_mid_lower.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
#![allow(clippy::unwrap_used)]

use crate::test::util::new_empty_model;

#[test]
fn test_left() {
let mut model = new_empty_model();
model._set("A1", "Hello");
model._set("B1", "=LEFT(A1,3)");
model._set("B2", "=LEFT(A1)");
model._set("B3", "=LEFT(A1,0)");
model.evaluate();
assert_eq!(model._get_text("B1"), *"Hel");
assert_eq!(model._get_text("B2"), *"H");
assert_eq!(model._get_text("B3"), "");
}

#[test]
fn test_right() {
let mut model = new_empty_model();
model._set("A1", "Hello");
model._set("B1", "=RIGHT(A1,2)");
model._set("B2", "=RIGHT(A1)");
model._set("B3", "=RIGHT(A1,0)");
model.evaluate();
assert_eq!(model._get_text("B1"), *"lo");
assert_eq!(model._get_text("B2"), *"o");
assert_eq!(model._get_text("B3"), "");
}

#[test]
fn test_mid() {
let mut model = new_empty_model();
model._set("A1", "Hello");
model._set("B1", "=MID(A1,2,3)");
model._set("B2", "=MID(A1,1,2)");
model._set("B3", "=MID(A1,1,0)");
model.evaluate();
assert_eq!(model._get_text("B1"), *"ell");
assert_eq!(model._get_text("B2"), *"He");
assert_eq!(model._get_text("B3"), "");
}

#[test]
fn test_lower() {
let mut model = new_empty_model();
model._set("A1", "Hello WORLD");
model._set("B1", "=LOWER(A1)");
model._set("B2", "=LOWER(\"TEST\")");
model.evaluate();
assert_eq!(model._get_text("B1"), *"hello world");
assert_eq!(model._get_text("B2"), *"test");
}

#[test]
fn test_boundary_conditions() {
let mut model = new_empty_model();
model._set("A1", "Test");

model._set("B1", "=LEFT(A1,100)");
model._set("B2", "=RIGHT(A1,100)");
model._set("B3", "=MID(A1,1,100)");
model._set("B4", "=MID(A1,10,5)");
model._set("B5", "=MID(A1,3,10)");

model.evaluate();
assert_eq!(model._get_text("B1"), "Test");
assert_eq!(model._get_text("B2"), "Test");
assert_eq!(model._get_text("B3"), "Test");
assert_eq!(model._get_text("B4"), "");
assert_eq!(model._get_text("B5"), "st");
}

#[test]
fn test_invalid_parameters() {
let mut model = new_empty_model();
model._set("A1", "Hello");

model._set("B1", "=LEFT(A1,-1)");
model._set("B2", "=RIGHT(A1,-1)");
model._set("B3", "=MID(A1,-1,3)");
model._set("B4", "=MID(A1,0,3)");
model._set("B5", "=MID(A1,2,-1)");

model.evaluate();
assert_eq!(model._get_text("B1"), "#VALUE!");
assert_eq!(model._get_text("B2"), "#VALUE!");
assert_eq!(model._get_text("B3"), "#VALUE!");
assert_eq!(model._get_text("B4"), "#VALUE!");
assert_eq!(model._get_text("B5"), "#VALUE!");
}

#[test]
fn test_empty_strings() {
let mut model = new_empty_model();
model._set("A1", "");
model._set("A2", " Space ");

model._set("B1", "=LEFT(A1,5)");
model._set("B2", "=RIGHT(A1,5)");
model._set("B3", "=MID(A1,1,5)");
model._set("B4", "=LOWER(A1)");
model._set("B5", "=LEFT(A2,2)");
model._set("B6", "=LOWER(A2)");

model.evaluate();
assert_eq!(model._get_text("B1"), "");
assert_eq!(model._get_text("B2"), "");
assert_eq!(model._get_text("B3"), "");
assert_eq!(model._get_text("B4"), "");
assert_eq!(model._get_text("B5"), " ");
assert_eq!(model._get_text("B6"), " space ");
}
34 changes: 17 additions & 17 deletions docs/src/functions/text.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,33 +25,33 @@ You can track the progress in this [GitHub issue](https://github.com/ironcalc/Ir
| FIND | <Badge type="tip" text="Available" /> | – |
| FINDB | <Badge type="info" text="Not implemented yet" /> | – |
| FIXED | <Badge type="info" text="Not implemented yet" /> | – |
| LEFT | <Badge type="tip" text="Available" /> | |
| LEFT | <Badge type="tip" text="Available" /> | [LEFT](text/left) |
| LEFTB | <Badge type="info" text="Not implemented yet" /> | – |
| LEN | <Badge type="tip" text="Available" /> | – |
| LENB | <Badge type="info" text="Not implemented yet" /> | – |
| LOWER | <Badge type="info" text="Not implemented yet" /> | – |
| MID | <Badge type="info" text="Not implemented yet" /> | – |
| LOWER | <Badge type="tip" text="Available" /> | [LOWER](text/lower) |
| MID | <Badge type="tip" text="Available" /> | [MID](text/mid) |
| MIDB | <Badge type="info" text="Not implemented yet" /> | – |
| NUMBERVALUE | <Badge type="info" text="Not implemented yet" /> | – |
| PHONETIC | <Badge type="info" text="Not implemented yet" /> | – |
| PROPER | <Badge type="info" text="Not implemented yet" /> | – |
| REPLACE | <Badge type="info" text="Not implemented yet" /> | – |
| REPLACEB | <Badge type="info" text="Not implemented yet" /> | – |
| REPT | <Badge type="tip" text="Available" /> | |
| RIGHT | <Badge type="tip" text="Available" /> | |
| REPT | <Badge type="tip" text="Available" /> | [REPT](text/rept) |
| RIGHT | <Badge type="tip" text="Available" /> | [RIGHT](text/right) |
| RIGHTB | <Badge type="info" text="Not implemented yet" /> | – |
| SEARCH | <Badge type="tip" text="Available" /> | |
| SEARCH | <Badge type="tip" text="Available" /> | [SEARCH](text/search) |
| SEARCHB | <Badge type="info" text="Not implemented yet" /> | – |
| SUBSTITUTE | <Badge type="tip" text="Available" /> | |
| T | <Badge type="tip" text="Available" /> | |
| TEXT | <Badge type="tip" text="Available" /> | |
| TEXTAFTER | <Badge type="tip" text="Available" /> | |
| TEXTBEFORE | <Badge type="tip" text="Available" /> | |
| TEXTJOIN | <Badge type="tip" text="Available" /> | |
| SUBSTITUTE | <Badge type="tip" text="Available" /> | [SUBSTITUTE](text/substitute) |
| T | <Badge type="tip" text="Available" /> | [T](text/t) |
| TEXT | <Badge type="tip" text="Available" /> | [TEXT](text/text) |
| TEXTAFTER | <Badge type="tip" text="Available" /> | [TEXTAFTER](text/textafter) |
| TEXTBEFORE | <Badge type="tip" text="Available" /> | [TEXTBEFORE](text/textbefore) |
| TEXTJOIN | <Badge type="tip" text="Available" /> | [TEXTJOIN](text/textjoin) |
| TEXTSPLIT | <Badge type="info" text="Not implemented yet" /> | – |
| TRIM | <Badge type="tip" text="Available" /> | |
| TRIM | <Badge type="tip" text="Available" /> | [TRIM](text/trim) |
| UNICHAR | <Badge type="info" text="Not implemented yet" /> | – |
| UNICODE | <Badge type="tip" text="Available" /> | |
| UPPER | <Badge type="tip" text="Available" /> | |
| VALUE | <Badge type="tip" text="Available" /> | |
| VALUETOTEXT | <Badge type="tip" text="Available" /> | |
| UNICODE | <Badge type="tip" text="Available" /> | [UNICODE](text/unicode) |
| UPPER | <Badge type="tip" text="Available" /> | [UPPER](text/upper) |
| VALUE | <Badge type="tip" text="Available" /> | [VALUE](text/value) |
| VALUETOTEXT | <Badge type="tip" text="Available" /> | [VALUETOTEXT](text/valuetotext) |
11 changes: 11 additions & 0 deletions docs/src/functions/text/left.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
layout: doc
outline: deep
lang: en-US
---

# LEFT

::: warning
🚧 This function is implemented but currently lacks detailed documentation. For guidance, you may refer to the equivalent functionality in [Microsoft Excel documentation](https://support.microsoft.com/en-us/office/excel-functions-by-category-5f91f4e9-7b42-46d2-9bd1-63f26a86c0eb).
:::
11 changes: 11 additions & 0 deletions docs/src/functions/text/lower.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
layout: doc
outline: deep
lang: en-US
---

# LOWER

::: warning
🚧 This function is implemented but currently lacks detailed documentation. For guidance, you may refer to the equivalent functionality in [Microsoft Excel documentation](https://support.microsoft.com/en-us/office/excel-functions-by-category-5f91f4e9-7b42-46d2-9bd1-63f26a86c0eb).
:::