Home Reference Source Test Repository

test/util/triangle-2d-test.js

import chai from 'chai';
chai.should();

import Point2D from '../../src/js/util/point-2d';
import Triangle2D from '../../src/js/util/triangle-2d';

/** @test {Triangle2D} **/
describe('Triangle2D', () => {
  /** @test {Triangle2D#constructor} **/
  describe('#constructor(a, b, c)', () => {
    it('creates instance of Triangle2D', () => {
      (new Triangle2D()).should.be.instanceof(Triangle2D);
    });
  });

  /** @test {Triangle2D#area} **/
  describe('.area', () => {
    let a;
    let b;
    let c;
    let triangle;

    it('should return the area of the triangle', () => {
      a = new Point2D(0, 0);
      b = new Point2D(3, 0);
      c = new Point2D(0, 4);
      triangle = new Triangle2D(a, b, c);
      (triangle.area).should.be.equal(6);
    });

    it('should return a negative value if vertexes are oriented clockwise around triangle', () => {
      a = new Point2D(0, 0);
      b = new Point2D(0, 4);
      c = new Point2D(3, 0);
      triangle = new Triangle2D(a, b, c);
      (triangle.area).should.be.equal(-6);
    });
  });

  /** @test {Triangle2D#getBarycentricCoordinates} **/
  describe('#getBarycentricCoordinates', () => {
    let a;
    let b;
    let c;
    let triangle;
    let point;
    let barycentricCoordinates;

    beforeEach(() => {
      a = new Point2D(1, 0);
      b = new Point2D(-1, 0);
      c = new Point2D(0, 3);
      triangle = new Triangle2D(a, b, c);
    });

    it('should return (1/3, 1/3) for centroid', () => {
      let cx = (a.x + b.x + c.x) / 3;
      let cy = (a.y + b.y + c.y) / 3;
      point = new Point2D(cx, cy);
      barycentricCoordinates = triangle.getBarycentricCoordinates(point);
      (barycentricCoordinates.x).should.be.equal(1 / 3);
      (barycentricCoordinates.y).should.be.equal(1 / 3);
    });
  });

  /** @test {Triangle2D#getPointFromBarycentricCoordinates} **/
  describe('#getPointFromBarycentricCoordinates', () => {
    let a;
    let b;
    let c;
    let triangle;
    let point;
    let barycentricCoordinates;

    beforeEach(() => {
      a = new Point2D(1, 0);
      b = new Point2D(-1, 0);
      c = new Point2D(0, 3);
      triangle = new Triangle2D(a, b, c);
    });

    it('should return centroid for coordinates (1/3, 1/3)', () => {
      barycentricCoordinates = new Point2D(1 / 3, 1 / 3);
      point = triangle.getPointFromBarycentricCoordinates(barycentricCoordinates);
      let cx = (a.x + b.x + c.x) / 3;
      let cy = (a.y + b.y + c.y) / 3;
      (point.x).should.be.equal(cx);
      (point.y).should.be.equal(cy);
    });
  });
});