« Return to Thread: equals in case class does not seem to be working...

Re: equals in case class does not seem to be working...

by Kevin Wright-4 :: Rate this Message:

Reply to Author | View in Thread

Agreed, it's a horrible thing to do, it *might* break pattern matching optimisations and any number of design contracts.

On the other hand, if it does work, then we have a convenient shortcut to auto-generate extractors and equality methods on mutable objects.



On Wed, Jul 8, 2009 at 4:17 PM, Daniel Sobral <dcsobral@...> wrote:
Why did you expect this to work? Case classes are supposed to be immutable.


On Tue, Jul 7, 2009 at 10:39 PM, Alexandre <alexmsmartins@...> wrote:
Hi to you all

First of all I'm a less than a year scala hobbyist (e. g. user) and
this is my first post to this list. So bare with me. :)
I was trying to do unit testing and I thought that using
assertEquals() in Junit 4 with objects from the same case class with
exactly the same content wold cut it. Yet, I run into some troubles
and ended up doing this small snippet in the scala shell that shows me
it does not work.
Am I doing anything wrong or is this to be expected?
If it is to be expected could you explain/point to some reading that
makes it clear why.

Thanks in advance
Alexandre Martins

------------------------------------------------------------------------------------------

scala> import scala.xml.Node
import scala.xml.Node

scala> import scala.xml.Elem
import scala.xml.Elem

scala> import scala.reflect.BeanProperty
import scala.reflect.BeanProperty

scala> import scala.reflect.BeanProperty
import scala.reflect.BeanProperty

scala> import java.util.Date
import java.util.Date

scala> import scala.reflect.BeanInfo
import scala.reflect.BeanInfo

scala> /**
   |  * Represents a user of WikiModels
   |  */

scala> @BeanInfo
   | case class User(usrName:String,
   |            pssword:String,
   |            frstName:String,
   |            lstName:String,
   |            mail:String ) extends DataModel {
   |
   |     var userName = usrName
   |     var password = pssword
   |     var firstName = frstName
   |     var lastName = lstName
   |     var emailAddress = mail
   |
   |     def this() = {
   |         this("","","","","")
   |     }
   |
   |     /**
   |      * generates a XML representation of the user, excluding password
   |      * @return the XML representing the user
   |      */
   |     def toXML:Node =
   |     <user>
   |         <username>{userName}</username>
   |         <!--<password>{password}</password>-->
   |         <firstName>{firstName}</firstName>
   |         <lastName>{lastName}</lastName>
   |         <email>{emailAddress}</email>
   |     </user>
   |
   |     def extractXML(xml:Node):Unit = {
   |         xml match {
   |             case <username>{contents}</username> =>
this.userName = contents.text
   |             case <firstName>{contents}</firstName> =>
this.firstName = contents.text
   |             case <lastName>{contents}</lastName> =>
this.lastName = contents.text
   |             case <email>{contents}</email> => this.emailAddress
= contents.text
   |             case <user>{c @ _ *}</user> => for (val child <- c)
extractXML(child)
   |             case _ => { }
   |         }
   |     }
   | }
defined class User

scala> var u = User("alex","alexp","Alexandre",
"Martins","alexmsmartins@...")
u: User = User(alex,alexp,Alexandre,Martins,alexmsmartins@...)

scala> var d = new User()
d: User = User(,,,,)

scala> u == d
res2: Boolean = false

scala> u
res3: User = User(alex,alexp,Alexandre,Martins,alexmsmartins@...)

scala> d
res4: User = User(,,,,)

scala> d.extractXML(  u.toXML)

scala> d.password = u.password

scala> d.password
res18: String = alexpscala> d
res7: User = User(,,,,)

scala> d.toXML == u.toXML
res8: Boolean = true

scala> d == u
res9: Boolean = false



--
Daniel C. Sobral

Something I learned in academia: there are three kinds of academic reviews: review by name, review by reference and review by value.

 « Return to Thread: equals in case class does not seem to be working...