Skip to content
Merged
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
22 changes: 18 additions & 4 deletions core/src/avm1/globals/text_snapshot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -159,11 +159,25 @@ fn set_select_color<'gc>(

fn find_text<'gc>(
activation: &mut Activation<'_, 'gc>,
_this: Object<'gc>,
_args: &[Value<'gc>],
this: Object<'gc>,
args: &[Value<'gc>],
) -> Result<Value<'gc>, Error<'gc>> {
avm1_stub!(activation, "TextSnapshot", "findText");
Ok(Value::Undefined)
let NativeObject::TextSnapshot(object) = this.native() else {
return Ok(Value::Undefined);
};

let [start, text, case_sensitive] = args else {
return Ok(Value::Undefined);
};

let start = start.coerce_to_i32(activation)?;
let text = text.coerce_to_string(activation)?;
let case_sensitive = case_sensitive.as_bool(activation.swf_version());

let index = object
.text_snapshot()
.find_text(start, text.as_wstr(), case_sensitive);
Ok(index.into())
}

fn get_text_run_info<'gc>(
Expand Down
37 changes: 37 additions & 0 deletions core/src/display_object/text.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ use gc_arena::{Collect, Gc, Mutation};
use ruffle_common::utils::HasPrefixField;
use ruffle_render::transform::Transform;
use ruffle_wstr::{WStr, WString};
use std::borrow::Cow;
use std::cell::RefCell;
use std::sync::Arc;

Expand Down Expand Up @@ -403,4 +404,40 @@ impl<'gc> TextSnapshot<'gc> {

ret
}

pub fn find_text(self, from: i32, text: &WStr, case_sensitive: bool) -> i32 {
if text.is_empty() {
return -1;
}

let Ok(from) = usize::try_from(from) else {
return -1;
};
let count = self.count();

let chunks = self
.0
.chunks
.iter()
.filter(|c| c.global_index + c.text.len() > from)
.map(|c| c.sub_string(from, count));

let mut full_text = WString::new();
for chunk in chunks {
full_text.push_str(chunk);
}

let text = if !case_sensitive {
full_text.make_ascii_lowercase();
Cow::Owned(text.to_ascii_lowercase())
} else {
Cow::Borrowed(text)
};

let Some(index) = full_text.find(text.as_ref()) else {
return -1;
};

i32::try_from(from + index).unwrap_or(-1)
}
}
44 changes: 44 additions & 0 deletions tests/tests/swfs/avm1/textsnapshot_findtext/output.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
getCount(): 11 [number]
findText(): undefined [undefined]
findText(0): undefined [undefined]
findText(1): undefined [undefined]
findText(1, "A"): undefined [undefined]
findText(1, "A", true): -1 [number]
findText(1, "A", true, 1): undefined [undefined]
findText(0, "A", true): 0 [number]
findText(0, "A", false): 0 [number]
findText(0, "a", false): 0 [number]
findText(0, "a", true): -1 [number]
findText(0, "EF", true): 4 [number]
findText(0, "eF", true): -1 [number]
findText(0, "eF", false): 4 [number]
findText(1, "EF", true): 4 [number]
findText(3, "EF", true): 4 [number]
findText(4, "EF", true): 4 [number]
findText(5, "EF", true): -1 [number]
findText(0, "FG", true): 5 [number]
findText(0, "FG", false): 5 [number]
findText(0, "gh", true): -1 [number]
findText(0, "gh", false): 6 [number]
findText(0, "F\nG", true): -1 [number]
findText(0, "F\nG", false): -1 [number]
findText(0, " ", false): -1 [number]
findText(3-like, "A", true): -1 [number]
findText(3-like, "E", true): 4 [number]
findText(0, C-like, true): 2 [number]
findText(4, C-like, true): -1 [number]
findText(0, "A", 1): 0 [number]
findText(0, "A", new Object()): 0 [number]
findText(0, "A", "0"): 0 [number]
findText(0, "ABCDEFGHIJK", true): 0 [number]
findText(0, "aBcdEfGHIjK", true): -1 [number]
findText(0, "aBcdEfGHIjK", false): 0 [number]
findText(-1, "A", 1): -1 [number]
findText(-10, "A", 1): -1 [number]
findText(100, "A", 1): -1 [number]
findText(0, "", true): -1 [number]
findText(0, "", false): -1 [number]
findText(1, "", true): -1 [number]
findText(1, "", false): -1 [number]
findText(-1, "", true): -1 [number]
findText(-1, "", false): -1 [number]
72 changes: 72 additions & 0 deletions tests/tests/swfs/avm1/textsnapshot_findtext/test.as
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
function check(name, value) {
var value2 = value;

if (typeof value2 === "string") {
value2 = value2.split("\r").join("\\r").split("\n").join("\\n");
}

trace(name + ": " + value2 + " [" + (typeof value) + "]");
}

var ts = new TextSnapshot(_root);

check("getCount()", ts.getCount());

check("findText()", ts.findText());
check("findText(0)", ts.findText(0));
check("findText(1)", ts.findText(1));
check("findText(1, \"A\")", ts.findText(1, "A"));
check("findText(1, \"A\", true)", ts.findText(1, "A", true));
check("findText(1, \"A\", true, 1)", ts.findText(1, "A", true, 1));

check("findText(0, \"A\", true)", ts.findText(0, "A", true));
check("findText(0, \"A\", false)", ts.findText(0, "A", false));
check("findText(0, \"a\", false)", ts.findText(0, "a", false));
check("findText(0, \"a\", true)", ts.findText(0, "a", true));

check("findText(0, \"EF\", true)", ts.findText(0, "EF", true));
check("findText(0, \"eF\", true)", ts.findText(0, "eF", true));
check("findText(0, \"eF\", false)", ts.findText(0, "eF", false));

check("findText(1, \"EF\", true)", ts.findText(1, "EF", true));
check("findText(3, \"EF\", true)", ts.findText(3, "EF", true));
check("findText(4, \"EF\", true)", ts.findText(4, "EF", true));
check("findText(5, \"EF\", true)", ts.findText(5, "EF", true));

check("findText(0, \"FG\", true)", ts.findText(0, "FG", true));
check("findText(0, \"FG\", false)", ts.findText(0, "FG", false));
check("findText(0, \"gh\", true)", ts.findText(0, "gh", true));
check("findText(0, \"gh\", false)", ts.findText(0, "gh", false));
check("findText(0, \"F\\nG\", true)", ts.findText(0, "F\nG", true));
check("findText(0, \"F\\nG\", false)", ts.findText(0, "F\nG", false));

check("findText(0, \" \", false)", ts.findText(0, " ", false));

var threeLike = {};
threeLike.valueOf = function() { return 3; }
check("findText(3-like, \"A\", true)", ts.findText(threeLike, "A", true));
check("findText(3-like, \"E\", true)", ts.findText(threeLike, "E", true));

var stringLike = {};
stringLike.toString = function() { return "C"; }
check("findText(0, C-like, true)", ts.findText(0, stringLike, true));
check("findText(4, C-like, true)", ts.findText(4, stringLike, true));

check("findText(0, \"A\", 1)", ts.findText(0, "A", 1));
check("findText(0, \"A\", new Object())", ts.findText(0, "A", new Object()));
check("findText(0, \"A\", \"0\")", ts.findText(0, "A", "0"));

check("findText(0, \"ABCDEFGHIJK\", true)", ts.findText(0, "ABCDEFGHIJK", true));
check("findText(0, \"aBcdEfGHIjK\", true)", ts.findText(0, "aBcdEfGHIjK", true));
check("findText(0, \"aBcdEfGHIjK\", false)", ts.findText(0, "aBcdEfGHIjK", false));

check("findText(-1, \"A\", 1)", ts.findText(-1, "A", 1));
check("findText(-10, \"A\", 1)", ts.findText(-10, "A", 1));
check("findText(100, \"A\", 1)", ts.findText(100, "A", 1));

check("findText(0, \"\", true)", ts.findText(0, "", true));
check("findText(0, \"\", false)", ts.findText(0, "", false));
check("findText(1, \"\", true)", ts.findText(1, "", true));
check("findText(1, \"\", false)", ts.findText(1, "", false));
check("findText(-1, \"\", true)", ts.findText(-1, "", true));
check("findText(-1, \"\", false)", ts.findText(-1, "", false));
Binary file not shown.
1 change: 1 addition & 0 deletions tests/tests/swfs/avm1/textsnapshot_findtext/test.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
num_ticks = 1
Original file line number Diff line number Diff line change
Expand Up @@ -59,25 +59,25 @@ PASSED: typeof(ts.findText()) == "undefined" [./TextSnapshot.as:114]
PASSED: typeof(ts.findText("a")) == "undefined" [./TextSnapshot.as:115]
PASSED: typeof(ts.findText(1)) == "undefined" [./TextSnapshot.as:116]
PASSED: typeof(ts.findText(1, "a")) == "undefined" [./TextSnapshot.as:117]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:120]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:121]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:122]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:123]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:124]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:125]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:126]
PASSED: typeof(ts.findText(1, "a", true)) == "number" [./TextSnapshot.as:120]
PASSED: typeof(ts.findText(1, "a", 1)) == "number" [./TextSnapshot.as:121]
PASSED: typeof(ts.findText(1, "a", new Date())) == "number" [./TextSnapshot.as:122]
PASSED: typeof(ts.findText("6", "a", new Date())) == "number" [./TextSnapshot.as:123]
PASSED: typeof(ts.findText("b", "a", new Date())) == "number" [./TextSnapshot.as:124]
PASSED: typeof(ts.findText(-1, "a", new Date())) == "number" [./TextSnapshot.as:125]
PASSED: typeof(ts.findText(Infinity, "a", new Date())) == "number" [./TextSnapshot.as:126]
PASSED: typeof(ts.findText(-1, "a", new Date(), "e")) == "undefined" [./TextSnapshot.as:127]
PASSED: typeof(ts.findText(Infinity, "a", new Date(), 3)) == "undefined" [./TextSnapshot.as:128]
FAILED: expected: -1 obtained: [./TextSnapshot.as:130]
FAILED: expected: -1 obtained: [./TextSnapshot.as:131]
FAILED: expected: -1 obtained: [./TextSnapshot.as:132]
FAILED: expected: -1 obtained: [./TextSnapshot.as:133]
FAILED: expected: -1 obtained: [./TextSnapshot.as:134]
FAILED: expected: -1 obtained: [./TextSnapshot.as:135]
FAILED: expected: -1 obtained: [./TextSnapshot.as:136]
PASSED: ts.findText(1, "a", true) == -1 [./TextSnapshot.as:130]
PASSED: ts.findText(1, "a", 1) == -1 [./TextSnapshot.as:131]
PASSED: ts.findText(1, "a", new Date()) == -1 [./TextSnapshot.as:132]
PASSED: ts.findText("6", "a", false) == -1 [./TextSnapshot.as:133]
PASSED: ts.findText("b", "a", true) == -1 [./TextSnapshot.as:134]
PASSED: ts.findText(-1, "a", new Date()) == -1 [./TextSnapshot.as:135]
PASSED: ts.findText(Infinity, "a", new Date()) == -1 [./TextSnapshot.as:136]
PASSED: ts.getCount() == 0 [./TextSnapshot.as:142]
FAILED: expected: -1 obtained: [./TextSnapshot.as:143]
FAILED: expected: -1 obtained: [./TextSnapshot.as:144]
PASSED: ts.findText(1, "a", true) == -1 [./TextSnapshot.as:143]
PASSED: ts.findText(1, "a", false) == -1 [./TextSnapshot.as:144]
PASSED: typeof(ts.getSelected()) == "undefined" [./TextSnapshot.as:148]
PASSED: typeof(ts.getSelected(0)) == "undefined" [./TextSnapshot.as:149]
PASSED: typeof(ts.getSelected("a")) == "undefined" [./TextSnapshot.as:150]
Expand Down Expand Up @@ -168,6 +168,6 @@ PASSED: typeof(ts.setSelected(0, 10, true)) == "undefined" [./TextSnapshot.as:24
PASSED: typeof(ts.setSelected(0, 10, "a", 11)) == "undefined" [./TextSnapshot.as:243]
PASSED: typeof(ts.setSelected(0, 10, 10, "hello")) == "undefined" [./TextSnapshot.as:244]
PASSED: typeof(ts.setSelected(0, 10, true, [3, 4])) == "undefined" [./TextSnapshot.as:245]
#passed: 127
#failed: 40
#passed: 143
#failed: 24
#total tests run: 167
Original file line number Diff line number Diff line change
Expand Up @@ -59,25 +59,25 @@ PASSED: typeof(ts.findText()) == "undefined" [./TextSnapshot.as:114]
PASSED: typeof(ts.findText("a")) == "undefined" [./TextSnapshot.as:115]
PASSED: typeof(ts.findText(1)) == "undefined" [./TextSnapshot.as:116]
PASSED: typeof(ts.findText(1, "a")) == "undefined" [./TextSnapshot.as:117]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:120]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:121]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:122]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:123]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:124]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:125]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:126]
PASSED: typeof(ts.findText(1, "a", true)) == "number" [./TextSnapshot.as:120]
PASSED: typeof(ts.findText(1, "a", 1)) == "number" [./TextSnapshot.as:121]
PASSED: typeof(ts.findText(1, "a", new Date())) == "number" [./TextSnapshot.as:122]
PASSED: typeof(ts.findText("6", "a", new Date())) == "number" [./TextSnapshot.as:123]
PASSED: typeof(ts.findText("b", "a", new Date())) == "number" [./TextSnapshot.as:124]
PASSED: typeof(ts.findText(-1, "a", new Date())) == "number" [./TextSnapshot.as:125]
PASSED: typeof(ts.findText(Infinity, "a", new Date())) == "number" [./TextSnapshot.as:126]
PASSED: typeof(ts.findText(-1, "a", new Date(), "e")) == "undefined" [./TextSnapshot.as:127]
PASSED: typeof(ts.findText(Infinity, "a", new Date(), 3)) == "undefined" [./TextSnapshot.as:128]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:130]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:131]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:132]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:133]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:134]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:135]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:136]
PASSED: ts.findText(1, "a", true) == -1 [./TextSnapshot.as:130]
PASSED: ts.findText(1, "a", 1) == -1 [./TextSnapshot.as:131]
PASSED: ts.findText(1, "a", new Date()) == -1 [./TextSnapshot.as:132]
PASSED: ts.findText("6", "a", false) == -1 [./TextSnapshot.as:133]
PASSED: ts.findText("b", "a", true) == -1 [./TextSnapshot.as:134]
PASSED: ts.findText(-1, "a", new Date()) == -1 [./TextSnapshot.as:135]
PASSED: ts.findText(Infinity, "a", new Date()) == -1 [./TextSnapshot.as:136]
PASSED: ts.getCount() == 0 [./TextSnapshot.as:142]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:143]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:144]
PASSED: ts.findText(1, "a", true) == -1 [./TextSnapshot.as:143]
PASSED: ts.findText(1, "a", false) == -1 [./TextSnapshot.as:144]
PASSED: typeof(ts.getSelected()) == "undefined" [./TextSnapshot.as:148]
PASSED: typeof(ts.getSelected(0)) == "undefined" [./TextSnapshot.as:149]
PASSED: typeof(ts.getSelected("a")) == "undefined" [./TextSnapshot.as:150]
Expand Down Expand Up @@ -168,6 +168,6 @@ PASSED: typeof(ts.setSelected(0, 10, true)) == "undefined" [./TextSnapshot.as:24
PASSED: typeof(ts.setSelected(0, 10, "a", 11)) == "undefined" [./TextSnapshot.as:243]
PASSED: typeof(ts.setSelected(0, 10, 10, "hello")) == "undefined" [./TextSnapshot.as:244]
PASSED: typeof(ts.setSelected(0, 10, true, [3, 4])) == "undefined" [./TextSnapshot.as:245]
#passed: 127
#failed: 40
#passed: 143
#failed: 24
#total tests run: 167
Original file line number Diff line number Diff line change
Expand Up @@ -59,25 +59,25 @@ PASSED: typeof(ts.findText()) == "undefined" [./TextSnapshot.as:114]
PASSED: typeof(ts.findText("a")) == "undefined" [./TextSnapshot.as:115]
PASSED: typeof(ts.findText(1)) == "undefined" [./TextSnapshot.as:116]
PASSED: typeof(ts.findText(1, "a")) == "undefined" [./TextSnapshot.as:117]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:120]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:121]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:122]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:123]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:124]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:125]
FAILED: expected: "number" obtained: undefined [./TextSnapshot.as:126]
PASSED: typeof(ts.findText(1, "a", true)) == "number" [./TextSnapshot.as:120]
PASSED: typeof(ts.findText(1, "a", 1)) == "number" [./TextSnapshot.as:121]
PASSED: typeof(ts.findText(1, "a", new Date())) == "number" [./TextSnapshot.as:122]
PASSED: typeof(ts.findText("6", "a", new Date())) == "number" [./TextSnapshot.as:123]
PASSED: typeof(ts.findText("b", "a", new Date())) == "number" [./TextSnapshot.as:124]
PASSED: typeof(ts.findText(-1, "a", new Date())) == "number" [./TextSnapshot.as:125]
PASSED: typeof(ts.findText(Infinity, "a", new Date())) == "number" [./TextSnapshot.as:126]
PASSED: typeof(ts.findText(-1, "a", new Date(), "e")) == "undefined" [./TextSnapshot.as:127]
PASSED: typeof(ts.findText(Infinity, "a", new Date(), 3)) == "undefined" [./TextSnapshot.as:128]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:130]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:131]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:132]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:133]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:134]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:135]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:136]
PASSED: ts.findText(1, "a", true) == -1 [./TextSnapshot.as:130]
PASSED: ts.findText(1, "a", 1) == -1 [./TextSnapshot.as:131]
PASSED: ts.findText(1, "a", new Date()) == -1 [./TextSnapshot.as:132]
PASSED: ts.findText("6", "a", false) == -1 [./TextSnapshot.as:133]
PASSED: ts.findText("b", "a", true) == -1 [./TextSnapshot.as:134]
PASSED: ts.findText(-1, "a", new Date()) == -1 [./TextSnapshot.as:135]
PASSED: ts.findText(Infinity, "a", new Date()) == -1 [./TextSnapshot.as:136]
PASSED: ts.getCount() == 0 [./TextSnapshot.as:142]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:143]
FAILED: expected: -1 obtained: undefined [./TextSnapshot.as:144]
PASSED: ts.findText(1, "a", true) == -1 [./TextSnapshot.as:143]
PASSED: ts.findText(1, "a", false) == -1 [./TextSnapshot.as:144]
PASSED: typeof(ts.getSelected()) == "undefined" [./TextSnapshot.as:148]
PASSED: typeof(ts.getSelected(0)) == "undefined" [./TextSnapshot.as:149]
PASSED: typeof(ts.getSelected("a")) == "undefined" [./TextSnapshot.as:150]
Expand Down Expand Up @@ -168,6 +168,6 @@ PASSED: typeof(ts.setSelected(0, 10, true)) == "undefined" [./TextSnapshot.as:24
PASSED: typeof(ts.setSelected(0, 10, "a", 11)) == "undefined" [./TextSnapshot.as:243]
PASSED: typeof(ts.setSelected(0, 10, 10, "hello")) == "undefined" [./TextSnapshot.as:244]
PASSED: typeof(ts.setSelected(0, 10, true, [3, 4])) == "undefined" [./TextSnapshot.as:245]
#passed: 127
#failed: 40
#passed: 143
#failed: 24
#total tests run: 167
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ Zweites Textfeld
Some more static text here... abcdefgh' [TextSnapshotTest.c:144]
PASSED: ts.getText(0, 14, true) == 'First text
Zwei' [TextSnapshotTest.c:146]
FAILED: expected: -1 obtained: undefined [TextSnapshotTest.c:148]
FAILED: expected: 0 obtained: undefined [TextSnapshotTest.c:149]
FAILED: expected: 22 obtained: undefined [TextSnapshotTest.c:150]
FAILED: expected: 2 obtained: undefined [TextSnapshotTest.c:151]
FAILED: expected: -1 obtained: undefined [TextSnapshotTest.c:152]
FAILED: expected: -1 obtained: undefined [TextSnapshotTest.c:153]
FAILED: expected: -1 obtained: undefined [TextSnapshotTest.c:154]
FAILED: expected: -1 obtained: undefined [TextSnapshotTest.c:155]
FAILED: expected: -1 obtained: undefined [TextSnapshotTest.c:156]
PASSED: ts.findText(0, '', false) == -1 [TextSnapshotTest.c:148]
PASSED: ts.findText(0, 'f', false) == 0 [TextSnapshotTest.c:149]
PASSED: ts.findText(0, 'f', true) == 22 [TextSnapshotTest.c:150]
PASSED: ts.findText(1, 'Rst', false) == 2 [TextSnapshotTest.c:151]
PASSED: ts.findText(3, 'RSt', false) == -1 [TextSnapshotTest.c:152]
PASSED: ts.findText(100, 'h', false) == -1 [TextSnapshotTest.c:153]
PASSED: ts.findText(64, 'h', false) == -1 [TextSnapshotTest.c:154]
PASSED: ts.findText(-5, 'Zwei', true) == -1 [TextSnapshotTest.c:155]
PASSED: ts.findText(-5, 'gh', true) == -1 [TextSnapshotTest.c:156]
FAILED: expected: ' textZweites TextfeldSome' obtained: undefined [TextSnapshotTest.c:159]
FAILED: expected: ' text
Zweites Textfeld
Expand Down Expand Up @@ -127,6 +127,6 @@ PASSED: typeof(ts) == 'undefined' [TextSnapshotTest.c:295]
PASSED: typeof(ts) == 'object' [TextSnapshotTest.c:298]
PASSED: typeof(ts) == 'object' [TextSnapshotTest.c:303]
PASSED: typeof(ts) == 'object' [TextSnapshotTest.c:306]
#passed: 28
#failed: 96
#passed: 37
#failed: 87
#total tests run: 124
Loading
Loading