patternjavascriptMinor
Javascript assert function
Viewed 0 times
javascriptassertfunction
Problem
I need to compare some values of a Javascript object. If they fail to be identical, I want to pretty print to
The initial code I have written which I find fugly after a JS beautify looks like:
Please tell me I've missed the plot and I could write this a lot better. Feel free to critique the rest of the code. Thank you!
console.log the mismatch.The initial code I have written which I find fugly after a JS beautify looks like:
function assert(a, b, message) {
if (a != b) {
console.log("Failed to match " + message + " " + a + " != " + b);
return false;
}
return true;
}
if (!assert(parsedInput.protocol, cu.protocol, "protocol")) {
continue;
}
if (!assert(parsedInput.port, cu.port, "port")) {
continue;
}
if (!assert(parsedInput.hostname, cu.hostname, "hostname")) {
continue;
}
if (!assert(parsedInput.hash, cu.hash, "hash")) {
continue;
}Please tell me I've missed the plot and I could write this a lot better. Feel free to critique the rest of the code. Thank you!
Solution
I (and many other people) expect certain behavior from a function called "assert"...namely that it throws an exception or otherwise halts execution if the asserted condition isn't true. If your assert function did that, you wouldn't have to test the return value.
If that's not what you want, then you should seriously consider renaming your function. Maybe
Now, as for your equality tests, you could do something like
Benefits of this approach being, you get to see all of what doesn't match, rather than stopping at the first thing.
function assertEqual(a, b, message)
{
if (a != b) throw new Error(message + " mismatch: " + a + " != " + b);
}
assertEqual(parsedInput.protocol, cu.protocol, "protocol");
assertEqual(parsedInput.port, cu.port, "port");
assertEqual(parsedInput.hostname, cu.hostname, "hostname");
assertEqual(parsedInput.hash, cu.hash, "hash");If that's not what you want, then you should seriously consider renaming your function. Maybe
check or something, i dunno. Assertions die when they're false.Now, as for your equality tests, you could do something like
function propsEqual(obj1, obj2, propNames) {
var result = true;
for (var i = 0; i < propNames.length; ++i) {
var prop = propNames[i];
if (obj1[prop] != obj2[prop]) {
console.log("Failed to match " + prop +": " + obj1[prop] + " != " + obj2[prop]);
result = false;
}
}
return result;
}
if (!propsEqual(parsedInput, cu, ["protocol", "port", "hostname", "hash"])) {
console.log("Skipping.");
continue;
}Benefits of this approach being, you get to see all of what doesn't match, rather than stopping at the first thing.
Code Snippets
function assertEqual(a, b, message)
{
if (a != b) throw new Error(message + " mismatch: " + a + " != " + b);
}
assertEqual(parsedInput.protocol, cu.protocol, "protocol");
assertEqual(parsedInput.port, cu.port, "port");
assertEqual(parsedInput.hostname, cu.hostname, "hostname");
assertEqual(parsedInput.hash, cu.hash, "hash");function propsEqual(obj1, obj2, propNames) {
var result = true;
for (var i = 0; i < propNames.length; ++i) {
var prop = propNames[i];
if (obj1[prop] != obj2[prop]) {
console.log("Failed to match " + prop +": " + obj1[prop] + " != " + obj2[prop]);
result = false;
}
}
return result;
}
if (!propsEqual(parsedInput, cu, ["protocol", "port", "hostname", "hash"])) {
console.log("Skipping.");
continue;
}Context
StackExchange Code Review Q#5605, answer score: 8
Revisions (0)
No revisions yet.