Skip to content

Commit

Permalink
equality check in matcher & incorrect arg error
Browse files Browse the repository at this point in the history
  • Loading branch information
EladBezalel committed Oct 10, 2023
1 parent 74e1351 commit fcadc5c
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 18 deletions.
39 changes: 33 additions & 6 deletions src/bun.js/test/expect.zig
Original file line number Diff line number Diff line change
Expand Up @@ -2666,19 +2666,46 @@ pub const Expect = struct {
const expected = arguments[0];
const value: JSValue = this.getValue(globalThis, thisValue, "toEqualIgnoringWhitespace", "<green>expected<r>") orelse return .zero;

if (!expected.isString()) {
globalThis.throw("toEqualIgnoringWhitespace() requires argument to be a string", .{});
return .zero;
}

const not = this.flags.not;
var pass = value.isString() and expected.isString();

if (pass) {
var expectedStr = expected.toString(globalThis).toSlice(globalThis, default_allocator).slice();
var valueStr = value.toString(globalThis).toSlice(globalThis, default_allocator).slice();
var expectedStr = expected.toString(globalThis).toSlice(globalThis, default_allocator).slice();

var left: usize = 0;
var right: usize = 0;

while (left < valueStr.len and right < expectedStr.len) {
var left_buffer = @min(left + 1024, valueStr.len);
var right_buffer = @min(right + 1024, expectedStr.len);

while (left < left_buffer and right < right_buffer) {
while (left < left_buffer and std.ascii.isWhitespace(valueStr[left])) left += 1;
while (right < right_buffer and std.ascii.isWhitespace(expectedStr[right])) right += 1;

// Remove all whitespace from both strings
expectedStr = strings.removeWhitespace(default_allocator, expectedStr);
valueStr = strings.removeWhitespace(default_allocator, valueStr);
if (left >= left_buffer or right >= right_buffer) break;

// Compare the strings
pass = strings.eql(expectedStr, valueStr);
if (valueStr[left] != expectedStr[right]) {
pass = false;
break;
}

left += 1;
right += 1;
}

if (!pass or left >= valueStr.len or right >= expectedStr.len) break;
}

if (left < valueStr.len or right < expectedStr.len) {
pass = false;
}
}

if (not) pass = !pass;
Expand Down
12 changes: 0 additions & 12 deletions src/string_immutable.zig
Original file line number Diff line number Diff line change
Expand Up @@ -4847,15 +4847,3 @@ pub fn concatIfNeeded(
}
std.debug.assert(remain.len == 0);
}

pub fn removeWhitespace(allocator: std.mem.Allocator, str: []const u8) []u8 {
var result = allocator.alloc(u8, str.len) catch unreachable;
var j: usize = 0;
for (str) |char| {
if (!std.ascii.isWhitespace(char)) {
result[j] = char;
j += 1;
}
}
return result[0..j];
}
7 changes: 7 additions & 0 deletions test/js/bun/test/expect.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3090,6 +3090,13 @@ describe("expect()", () => {
l
l
o`).toEqualIgnoringWhitespace("hello");
expect(`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec nec posuere felis. Aliquam tincidunt elit a nunc hendrerit maximus. Morbi semper tristique lectus, eget ullamcorper velit ullamcorper non. Aenean nibh augue, ultrices id ornare quis, eleifend id metus. Aliquam erat volutpat. Proin maximus, ligula at consequat venenatis, sapien odio auctor mi, sit amet placerat augue odio et orci. Vivamus tempus hendrerit tortor, et interdum est semper malesuada. Ut venenatis iaculis felis eget euismod. Suspendisse sed nisi eget massa fringilla rhoncus non quis enim. Mauris feugiat pellentesque justo, at sagittis augue sollicitudin vel. Pellentesque porttitor consequat mi nec varius. Praesent aliquet at justo nec finibus. Donec ut lorem eu ex dignissim pulvinar at sit amet sem. Ut fringilla sit amet dolor vitae convallis. Ut faucibus a purus sit amet fermentum.
Sed sit amet tortor magna. Pellentesque laoreet lorem at pulvinar efficitur. Nulla dictum nibh ac gravida semper. Duis tempus elit in ipsum feugiat porttitor.`).toEqualIgnoringWhitespace(
`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec nec posuere felis. Aliquam tincidunt elit a nunc hendrerit maximus. Morbi semper tristique lectus, eget ullamcorper velit ullamcorper non. Aenean nibh augue, ultrices id ornare quis, eleifend id metus. Aliquam erat volutpat. Proin maximus, ligula at consequat venenatis, sapien odio auctor mi, sit amet placerat augue odio et orci. Vivamus tempus hendrerit tortor, et interdum est semper malesuada. Ut venenatis iaculis felis eget euismod. Suspendisse sed nisi eget massa fringilla rhoncus non quis enim. Mauris feugiat pellentesque justo, at sagittis augue sollicitudin vel. Pellentesque porttitor consequat mi nec varius. Praesent aliquet at justo nec finibus. Donec ut lorem eu ex dignissim pulvinar at sit amet sem. Ut fringilla sit amet dolor vitae convallis. Ut faucibus a purus sit amet fermentum. Sed sit amet tortor magna. Pellentesque laoreet lorem at pulvinar efficitur. Nulla dictum nibh ac gravida semper. Duis tempus elit in ipsum feugiat porttitor.`,
);

expect("hello world").not.toEqualIgnoringWhitespace("hello world!");
expect({}).not.toEqualIgnoringWhitespace({});
});

test("toBeSymbol()", () => {
Expand Down
7 changes: 7 additions & 0 deletions test/js/bun/test/jest-extended.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -597,6 +597,13 @@ describe("jest-extended", () => {
l
l
o`).toEqualIgnoringWhitespace("hello");
expect(`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec nec posuere felis. Aliquam tincidunt elit a nunc hendrerit maximus. Morbi semper tristique lectus, eget ullamcorper velit ullamcorper non. Aenean nibh augue, ultrices id ornare quis, eleifend id metus. Aliquam erat volutpat. Proin maximus, ligula at consequat venenatis, sapien odio auctor mi, sit amet placerat augue odio et orci. Vivamus tempus hendrerit tortor, et interdum est semper malesuada. Ut venenatis iaculis felis eget euismod. Suspendisse sed nisi eget massa fringilla rhoncus non quis enim. Mauris feugiat pellentesque justo, at sagittis augue sollicitudin vel. Pellentesque porttitor consequat mi nec varius. Praesent aliquet at justo nec finibus. Donec ut lorem eu ex dignissim pulvinar at sit amet sem. Ut fringilla sit amet dolor vitae convallis. Ut faucibus a purus sit amet fermentum.
Sed sit amet tortor magna. Pellentesque laoreet lorem at pulvinar efficitur. Nulla dictum nibh ac gravida semper. Duis tempus elit in ipsum feugiat porttitor.`).toEqualIgnoringWhitespace(
`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec nec posuere felis. Aliquam tincidunt elit a nunc hendrerit maximus. Morbi semper tristique lectus, eget ullamcorper velit ullamcorper non. Aenean nibh augue, ultrices id ornare quis, eleifend id metus. Aliquam erat volutpat. Proin maximus, ligula at consequat venenatis, sapien odio auctor mi, sit amet placerat augue odio et orci. Vivamus tempus hendrerit tortor, et interdum est semper malesuada. Ut venenatis iaculis felis eget euismod. Suspendisse sed nisi eget massa fringilla rhoncus non quis enim. Mauris feugiat pellentesque justo, at sagittis augue sollicitudin vel. Pellentesque porttitor consequat mi nec varius. Praesent aliquet at justo nec finibus. Donec ut lorem eu ex dignissim pulvinar at sit amet sem. Ut fringilla sit amet dolor vitae convallis. Ut faucibus a purus sit amet fermentum. Sed sit amet tortor magna. Pellentesque laoreet lorem at pulvinar efficitur. Nulla dictum nibh ac gravida semper. Duis tempus elit in ipsum feugiat porttitor.`,
);

expect("hello world").not.toEqualIgnoringWhitespace("hello world!");
expect({}).not.toEqualIgnoringWhitespace({});
});

// Symbol
Expand Down

0 comments on commit fcadc5c

Please sign in to comment.