All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.unlaxer.tinyexpression.BackTrackingStressTest Maven / Gradle / Ivy

package org.unlaxer.tinyexpression;

import static org.junit.Assert.assertTrue;

import java.math.BigDecimal;
import java.math.RoundingMode;

import org.junit.Test;
import org.unlaxer.ParserTestBase;
import org.unlaxer.StringSource;
import org.unlaxer.context.ParseContext;
import org.unlaxer.listener.OutputLevel;
import org.unlaxer.tinyexpression.CalculateContext.Angle;

public abstract class BackTrackingStressTest extends ParserTestBase{
	
	@Test
	public void testCalculate() {
		
		Calculator calculator = calculator();
		
		setLevel(OutputLevel.detail);
		
		CalculateContext context = new CalculateContext(2,RoundingMode.HALF_UP,Angle.DEGREE);
		for(int i = 0 ; i < 50;i++){
			StringBuilder formula = new StringBuilder();
			for(int r = 0 ; r < i;r++){
				formula.append("(");
			}
			formula.append("1");
			for(int r = 0 ; r < i;r++){
				formula.append(")");
			}
			assertTrue(calc(calculator,context,formula.toString(),new BigDecimal("1")));
		}
		
	}
	
	boolean calc(Calculator calculator , CalculateContext calculateContext , String formula , BigDecimal expected){
		long start = System.nanoTime();
		testAllMatch(calculator.getParser(), formula);
		CalculateResult calculateResult = calculator.calculate(calculateContext , formula);
		BigDecimal x = calculateResult.answer.get();
//		System.out.println(formula+":" + (System.nanoTime()-start)+"nsec");
		System.out.println((System.nanoTime()-start));
//		System.out.format(" %s = %s \n" , formula , x.toString());
		return expected.compareTo(x) ==0;
	}
	
	@Test
	public void testParse() {
		
		Calculator calculator = calculator();
		
		setLevel(OutputLevel.none);
		
		for(int i = 0 ; i < 50;i++){
			StringBuilder formula = new StringBuilder();
			for(int r = 0 ; r < i;r++){
				formula.append("(");
			}
			formula.append("1");
			for(int r = 0 ; r < i;r++){
				formula.append(")");
			}
			parse(calculator,formula.toString());
		}
		System.out.println();
		
	}
	
	void parse(Calculator calculator , String formula ){
		long start = System.nanoTime();
		StringSource stringSource ;
		for(int i =0 ; i < 1000;i++){
			stringSource = new StringSource(formula);
			calculator.getParser().parse(new ParseContext(stringSource));
		}
		System.out.println((System.nanoTime()-start));
	}
	
	public abstract Calculator calculator();

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy