forceOptionsToValidOptions tests

by joplomacedo

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

JavaScript

function getPrecisionFromNum(num) {
  const decimalPart = ("" + num).split(".")[1];
  return decimalPart ? decimalPart.length : 0;
}

function getPrecisionFromNumStr(numStr) {
  const decimalPart = numStr.split(".")[1];
  return decimalPart ? decimalPart.length : 0;
}

function toPrecision({num, precision}) {
	  const [naturalPart, decimalPart] = (''+num).split('.');
    
    if ( decimalPart ) {
       if ( precision === 0 ) {
  			return +naturalPart;
	    } else {
      	return +`${naturalPart}.${decimalPart.substr(0, precision)}`;
      }
    	
    } else {
    	return num;
    }
}

function forceNumToRespectUserOptions({
  num,
  options: {
    min,
    max,
    precision
  }
}) {
  if (num > max) {
    return max;
  }

  if (num < min) {
    return min;
  }

  if (getPrecisionFromNum(num) > precision) {
    return toPrecision({num, precision});
  }

  return num;
}

function multiplyText(text, times) {
  let result = '';
  for (let i = 0; i < times; i++) {
    result += text;
  }
  return result;
}

function test(name, fn, tests) {
  let title = `Testing: ${name}`;
  let delimiter = multiplyText('#', title.length);

  console.log(delimiter);
  console.log('Test: ' + name);

  tests.forEach((test, i) => {
    const {
      args,
      expected
    } = test;
    const result = fn(...args);
    const passed = _.isEqual(expected, result);


    if (passed) {
      console.log('passed: ', passed)
    } else {
      console.log(delimiter);
      console.log('arguments: ', ...args);
      console.log('result: ', result);
      console.log('expected: ', expected);
      console.error('passed: ', passed)
      console.log(delimiter);
    }
  });
}

console.clear();
test('forceNumToRespectUserOptions', forceNumToRespectUserOptions, [

  {
    args: [{
      num: 2.3,
      options: {
        min: 3,
        max: 4,
        precision: 1
      }
    }],

    expected: 3
  },
  
  {
    args: [{
      num: 4.3,
      options: {
        min: 3,
        max: 4.1,
       ...