0

I can not figure out why my unit test fails at the line,

assertTrue( (String) temp=="c+(d/f)-e");

even though when I print the content of temp serially, it is the same.

Here are the codes

Unit Test

import static org.junit.Assert.*;

import org.junit.Test;


public class LexerTest {


    @Test
    public void testGetInExpression(){
        //------
        Lexer lex=new Lexer("a+b*(c+(d/f)-e)-g");
        //--This test passes
        assertTrue((String)lex.getLexStr()=="a+b*(c+(d/f)-e)-g");
        //------

        for(int i=0;i<5;i++){
            lex.getNext();
        }

        //----------------
        //Method returns a in-expression (or a substring within first parantheses)
        Lexer sub=lex.getInExpression(); 
        String temp=sub.getLexStr(); //returns a type String
        System.out.println(temp);
        System.out.println(temp.length());

        //printing out each character of 'temp'
        for(int i=0;i<temp.length();i++){
            System.out.print(i);
            System.out.print(" = ");
            System.out.println(temp.charAt(i));
            //prints: the string 
            // 0 = c
            // 1 = +
            // ...
            // ..
            // 8 = e
        }

        //The following fails (mysteriously!!)
        assertTrue( (String) temp=="c+(d/f)-e");
        //assertTrue( (Character)lex.getNext()=='-');
    }
}

here is the class Lexer:

public class Lexer {
    private int size;
    private int posn;
    private String lexStr;

    public Lexer(String val){
        lexStr=val;
        size=lexStr.length();
        posn=0;     
    }

    public String getLexStr(){
        return lexStr;
    }
    public Object getNext(){
        posn=posn+1;
        if(posn<size){return current();} //return character at next site
        else {return null;}              //return a null value to indicate end
    };

    public Object current(){
        if(posn<size){
            char c=lexStr.charAt(posn);
            if(Character.isDigit(c)){
                return Character.getNumericValue(c); //return an Integer object
            }else
                return c; //Return a plain character
        }
        else{
            return null;
        }
    };

    public Lexer getInExpression(){
        //This must return a subExpression in the original Expression enclosed by braces
            int open=1;
            int closed=0;
            String returnStr=null;
            String temp=lexStr.substring(posn);
            for(int a=0; a <temp.length(); a++){
                getNext();
                if(temp.charAt(a)=='('){
                    open++;
                }else if(temp.charAt(a)==')'){
                    closed++;
                    if(open==closed){
                        returnStr=temp.substring(0,a);
                        break;
                    }
                }
            }
            //---check for validity of returnStr
            if (returnStr==null){
                System.out.println("I cannot be null! Please check here");
                return null;
            }else{
                Lexer inExpr=new Lexer(returnStr);      
                return inExpr;
            }


    }
}
apil.tamang
  • 2,545
  • 7
  • 29
  • 40

3 Answers3

1

You should use assertEquals, not assertTrue. Comparing with == is not good for different String objects.

Gábor Bakos
  • 8,982
  • 52
  • 35
  • 52
1

Always use "equals" when comparing Strings, not "==".

"==" compares references whearas "equals" compares the values, which is what you want.

VeeJay
  • 85
  • 4
1

The == operator in java checks that two objects (in this case - strings) are the same reference. If equal strings were constructed differently, there is no guarantee that they will occupy the same reference. Instead, you should use the equals(Object) method.

In JUnit, this can easily be done by using the assertEquals method:

assertEquals("c+(d/f)-e", temp);
Mureinik
  • 297,002
  • 52
  • 306
  • 350