Bug 1283522 - Reps: support -0 grip in number rep. r=linclark draft
authorSteve Chung <schung@mozilla.com>
Wed, 13 Jul 2016 11:37:27 +0800
changeset 387491 fe9efa84f88e82cb5c0383ef87f071cf34abd85b
parent 386893 04821a70c739a00d12e12df651c0989441e22728
child 525353 598f32d265ed7aca0397298c52a8b4f53c17bba2
push id22962
push userschung@mozilla.com
push dateThu, 14 Jul 2016 02:40:49 +0000
reviewerslinclark
bugs1283522
milestone50.0a1
Bug 1283522 - Reps: support -0 grip in number rep. r=linclark MozReview-Commit-ID: BWvMlbNdckG
devtools/client/shared/components/reps/number.js
devtools/client/shared/components/test/mochitest/test_reps_number.html
--- a/devtools/client/shared/components/reps/number.js
+++ b/devtools/client/shared/components/reps/number.js
@@ -15,31 +15,36 @@ define(function (require, exports, modul
 
   /**
    * Renders a number
    */
   const Number = React.createClass({
     displayName: "Number",
 
     stringify: function (object) {
-      return (Object.is(object, -0) ? "-0" : String(object));
+      let isNegativeZero = Object.is(object, -0) ||
+        (object.type && object.type == "-0");
+
+      return (isNegativeZero ? "-0" : String(object));
     },
 
     render: function () {
       let value = this.props.object;
+
       return (
         ObjectBox({className: "number"},
           this.stringify(value)
         )
       );
     }
   });
 
   function supportsObject(object, type) {
-    return type == "boolean" || type == "number";
+    return type == "boolean" || type == "number" ||
+      (type == "object" && object.type == "-0");
   }
 
   // Exports from this module
 
   exports.Number = {
     rep: Number,
     supportsObject: supportsObject
   };
--- a/devtools/client/shared/components/test/mochitest/test_reps_number.html
+++ b/devtools/client/shared/components/test/mochitest/test_reps_number.html
@@ -16,16 +16,17 @@ Test Number rep
 <script type="application/javascript;version=1.8">
 window.onload = Task.async(function* () {
   let { Rep } = browserRequire("devtools/client/shared/components/reps/rep");
   let { Number } = browserRequire("devtools/client/shared/components/reps/number");
 
   try {
     yield testInt();
     yield testBoolean();
+    yield testNegativeZero();
     yield testUnsafeInt();
   } catch(e) {
     ok(false, "Got an error: " + DevToolsUtils.safeErrorString(e));
   } finally {
     SimpleTest.finish();
   }
 
 
@@ -43,32 +44,51 @@ window.onload = Task.async(function* () 
 
     let renderedComponent = renderComponent(Number.rep, { object: getGripStub("testTrue") });
     is(renderedComponent.textContent, "true", "Number rep has expected text content for boolean true");
 
     renderedComponent = renderComponent(Number.rep, { object: getGripStub("testFalse") });
     is(renderedComponent.textContent, "false", "Number rep has expected text content for boolean false");
   }
 
+  function testNegativeZero() {
+    const renderedRep = shallowRenderComponent(Rep, { object: getGripStub("testNegZeroGrip") });
+    is(renderedRep.type, Number.rep, `Rep correctly selects ${Number.rep.displayName} for negative zero value`);
+
+    let renderedComponent = renderComponent(Number.rep, { object: getGripStub("testNegZeroGrip") });
+    is(renderedComponent.textContent, "-0", "Number rep has expected text content for negative zero grip");
+
+    renderedComponent = renderComponent(Number.rep, { object: getGripStub("testNegZeroValue") });
+    is(renderedComponent.textContent, "-0", "Number rep has expected text content for negative zero value");
+  }
+
   function testUnsafeInt() {
     const renderedComponent = renderComponent(Number.rep, { object: getGripStub("testUnsafeInt") });
     is(renderedComponent.textContent, "900719925474099100", "Number rep has expected text content for a long number");
   }
 
   function getGripStub(name) {
     switch (name) {
       case "testInt":
         return 5;
 
       case "testTrue":
         return true;
 
       case "testFalse":
         return false;
 
+      case "testNegZeroValue":
+        return -0;
+
+      case "testNegZeroGrip":
+        return {
+          "type": "-0"
+        };
+
       case "testUnsafeInt":
         return 900719925474099122;
     }
   }
 });
 </script>
 </pre>
 </body>