From 980aa10e0443166babee31aef0ec491cbd22805c Mon Sep 17 00:00:00 2001
From: Tim van der Meij <timvandermeij@gmail.com>
Date: Mon, 20 Jul 2015 22:01:47 +0200
Subject: [PATCH] Refactor annotation rectangle code and add unit tests

This patch refactors the code responsible for setting the annotation's rectangle. Its goal is to:

- Actually check that the input array is actually an array, and if so, that it contains exactly four elements.
- Only call `normalizeRect` if the input array is valid, i.e., we do not call it for the default rectangle anymore.

Unit tests are provided just like with the other patches in this series.
---
 src/core/annotation.js             | 20 ++++++++++++++++++--
 test/unit/annotation_layer_spec.js | 18 ++++++++++++++++++
 2 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/src/core/annotation.js b/src/core/annotation.js
index a88acaf41..d5ad2e978 100644
--- a/src/core/annotation.js
+++ b/src/core/annotation.js
@@ -75,10 +75,11 @@ var Annotation = (function AnnotationClosure() {
     var data = this.data = {};
 
     data.subtype = dict.get('Subtype').name;
-    var rect = dict.get('Rect') || [0, 0, 0, 0];
-    data.rect = Util.normalizeRect(rect);
     data.annotationFlags = dict.get('F');
 
+    this.setRectangle(dict.get('Rect'));
+    data.rect = this.rectangle;
+
     this.setColor(dict.get('C'));
     data.color = this.color;
 
@@ -91,6 +92,21 @@ var Annotation = (function AnnotationClosure() {
   }
 
   Annotation.prototype = {
+    /**
+     * Set the rectangle.
+     *
+     * @public
+     * @memberof Annotation
+     * @param {Array} rectangle - The rectangle array with exactly four entries
+     */
+    setRectangle: function Annotation_setRectangle(rectangle) {
+      if (isArray(rectangle) && rectangle.length === 4) {
+        this.rectangle = Util.normalizeRect(rectangle);
+      } else {
+        this.rectangle = [0, 0, 0, 0];
+      }
+    },
+
     /**
      * Set the color and take care of color space conversion.
      *
diff --git a/test/unit/annotation_layer_spec.js b/test/unit/annotation_layer_spec.js
index 1c45b633f..a8ec90698 100644
--- a/test/unit/annotation_layer_spec.js
+++ b/test/unit/annotation_layer_spec.js
@@ -7,6 +7,24 @@
 
 describe('Annotation layer', function() {
   describe('Annotation', function() {
+    it('should set and get a valid rectangle', function() {
+      var dict = new Dict();
+      dict.set('Subtype', '');
+      var annotation = new Annotation({ dict: dict, ref: 0 });
+      annotation.setRectangle([117, 694, 164.298, 720]);
+
+      expect(annotation.rectangle).toEqual([117, 694, 164.298, 720]);
+    });
+
+    it('should not set and get an invalid rectangle', function() {
+      var dict = new Dict();
+      dict.set('Subtype', '');
+      var annotation = new Annotation({ dict: dict, ref: 0 });
+      annotation.setRectangle([117, 694, 164.298]);
+
+      expect(annotation.rectangle).toEqual([0, 0, 0, 0]);
+    });
+
     it('should reject a color if it is not an array', function() {
       var dict = new Dict();
       dict.set('Subtype', '');