1 /*
   2  * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.javafx.css;
  27 
  28 import static org.junit.Assert.assertEquals;
  29 import static org.junit.Assert.assertFalse;
  30 import static org.junit.Assert.assertTrue;
  31 
  32 import com.sun.javafx.css.converters.StringConverter;
  33 import com.sun.javafx.css.parser.CSSParser;
  34 import javafx.scene.text.Font;
  35 
  36 import org.junit.Test;
  37 
  38 import com.sun.javafx.css.converters.SizeConverter;
  39 import java.io.ByteArrayInputStream;
  40 import java.io.ByteArrayOutputStream;
  41 import java.io.DataInputStream;
  42 import java.io.DataOutputStream;
  43 import java.io.IOException;
  44 import javafx.css.ParsedValue;
  45 
  46 public class ParsedValueTest {
  47 
  48     public ParsedValueTest() {
  49     }
  50 
  51     /**
  52      * Test of getValue method, of class ParsedValue.
  53      */
  54     @Test
  55     public void testGetValue() {
  56         //System.out.println("getValue");
  57         ParsedValue<Size,Size> instance =
  58                 new ParsedValueImpl<Size,Size>(new Size(100.0, SizeUnits.PERCENT), null);
  59         Size expResult = new Size(100.0, SizeUnits.PERCENT);;
  60         Size result = instance.getValue();
  61         assertEquals(expResult, result);
  62     }
  63 
  64     /**
  65      * Test of convert method, of class ParsedValue.
  66      */
  67     @Test
  68     public void testConvert() {
  69         ///System.out.println("convert");
  70         Font font = Font.getDefault();
  71         Size size = new Size(1.0, SizeUnits.EM);
  72         ParsedValue<ParsedValue<?,Size>,Number> value =
  73             new ParsedValueImpl<ParsedValue<?,Size>,Number>(
  74                 new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
  75                 SizeConverter.getInstance());
  76 
  77         double expResult = font.getSize();
  78         double result = value.convert(font).doubleValue();
  79         assertEquals(expResult, result, 0.01);
  80     }
  81 
  82     @Test
  83     public void testEquals() {
  84 
  85         Font font = Font.getDefault();
  86         Size size = new Size(1.0, SizeUnits.EM);
  87         ParsedValue<ParsedValue<?,Size>,Number> value1 =
  88             new ParsedValueImpl<ParsedValue<?,Size>,Number>(
  89                 new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
  90                 SizeConverter.getInstance());
  91 
  92         ParsedValue<ParsedValue<?,Size>,Number> value2 =
  93             new ParsedValueImpl<ParsedValue<?,Size>,Number>(
  94                 new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
  95                 null);
  96 
  97         // ParsedValue.equals doesn't care about the converter
  98         assertTrue(value1.equals(value2));
  99 
 100         value1 =
 101             new ParsedValueImpl<ParsedValue<?,Size>,Number>(
 102                 new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 103                 SizeConverter.getInstance());
 104 
 105         value2 =
 106             new ParsedValueImpl<ParsedValue<?,Size>,Number>(
 107                 new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null),
 108                 SizeConverter.getInstance());
 109 
 110         assertFalse(value1.equals(value2));
 111 
 112         value2 =
 113             new ParsedValueImpl<ParsedValue<?,Size>,Number>(
 114                 new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.PX), null),
 115                 SizeConverter.getInstance());
 116 
 117         assertFalse(value1.equals(value2));
 118 
 119         value2 =
 120             new ParsedValueImpl<ParsedValue<?,Size>,Number>(null, null);
 121 
 122         assertFalse(value1.equals(value2));
 123 
 124         ParsedValue<ParsedValue[],Number[]> value3 =
 125                 new ParsedValueImpl<ParsedValue[],Number[]>(
 126                     new ParsedValueImpl[] {
 127                         new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 128                         new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 129                     }, SizeConverter.SequenceConverter.getInstance()
 130                 );
 131 
 132         assertFalse(value1.equals(value3));
 133         assertFalse(value3.equals(value1));
 134 
 135         ParsedValue<ParsedValue[],Number[]> value4 =
 136                 new ParsedValueImpl<ParsedValue[],Number[]>(
 137                     new ParsedValueImpl[] {
 138                         new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 139                         new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 140                     }, SizeConverter.SequenceConverter.getInstance()
 141                 );
 142 
 143         assertTrue(value3.equals(value4));
 144 
 145         value4 =
 146                 new ParsedValueImpl<ParsedValue[],Number[]>(
 147                     new ParsedValueImpl[] {
 148                         new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null),
 149                         null
 150                     }, SizeConverter.SequenceConverter.getInstance()
 151                 );
 152 
 153         assertFalse(value3.equals(value4));
 154 
 155         value4 =
 156                 new ParsedValueImpl<ParsedValue[],Number[]>(
 157                     new ParsedValueImpl[] {
 158                         new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 159                         new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null),
 160                         new ParsedValueImpl<Size,Size>(new Size(3.0, SizeUnits.EM), null)
 161                     }, SizeConverter.SequenceConverter.getInstance()
 162                 );
 163 
 164         assertFalse(value3.equals(value4));
 165 
 166         value4 =
 167                 new ParsedValueImpl<ParsedValue[],Number[]>(
 168                     new ParsedValueImpl[] {
 169                         null
 170                     }, SizeConverter.SequenceConverter.getInstance()
 171                 );
 172 
 173         assertFalse(value3.equals(value4));
 174 
 175         value4 =
 176                 new ParsedValueImpl<ParsedValue[],Number[]>(
 177                     null,
 178                     SizeConverter.SequenceConverter.getInstance()
 179                 );
 180 
 181         assertFalse(value3.equals(value4));
 182 
 183         ParsedValue<ParsedValue[][],Number[][]> value5 =
 184                 new ParsedValueImpl<ParsedValue[][],Number[][]>(
 185                     new ParsedValueImpl[][] {
 186                         new ParsedValueImpl[] {
 187                             new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 188                             new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 189                         },
 190                         new ParsedValueImpl[] {
 191                             new ParsedValueImpl<Size,Size>(new Size(3.0, SizeUnits.EM), null),
 192                             new ParsedValueImpl<Size,Size>(new Size(4.0, SizeUnits.EM), null)
 193                         }
 194                     }, null
 195                 );
 196 
 197         assertFalse(value1.equals(value5));
 198         assertFalse(value3.equals(value5));
 199         assertFalse(value5.equals(value1));
 200         assertFalse(value5.equals(value3));
 201 
 202         ParsedValue<ParsedValue[][],Number[][]> value6 =
 203                 new ParsedValueImpl<ParsedValue[][],Number[][]>(
 204                     new ParsedValueImpl[][] {
 205                         new ParsedValueImpl[] {
 206                             new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 207                             new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 208                         },
 209                         new ParsedValueImpl[] {
 210                             new ParsedValueImpl<Size,Size>(new Size(3.0, SizeUnits.EM), null),
 211                             new ParsedValueImpl<Size,Size>(new Size(4.0, SizeUnits.EM), null)
 212                         }
 213                     }, null
 214                 );
 215 
 216         assertTrue(value5.equals(value6));
 217 
 218         value6 =
 219                 new ParsedValueImpl<ParsedValue[][],Number[][]>(
 220                     new ParsedValueImpl[][] {
 221                         new ParsedValueImpl[] {
 222                             new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 223                             new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 224                         },
 225                         new ParsedValueImpl[] {
 226                             new ParsedValueImpl<Size,Size>(new Size(3.0, SizeUnits.EM), null),
 227                             new ParsedValueImpl<Size,Size>(new Size(5.0, SizeUnits.EM), null),
 228                             new ParsedValueImpl<Size,Size>(new Size(4.0, SizeUnits.EM), null)
 229                         }
 230                     }, null
 231                 );
 232 
 233         assertFalse(value5.equals(value6));
 234 
 235         value6 =
 236                 new ParsedValueImpl<ParsedValue[][],Number[][]>(
 237                     new ParsedValueImpl[][] {
 238                         new ParsedValueImpl[] {
 239                             new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 240                             new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 241                         },
 242                         new ParsedValueImpl[] {
 243                             new ParsedValueImpl<Size,Size>(new Size(3.0, SizeUnits.EM), null),
 244                             null
 245                         }
 246                     }, null
 247                 );
 248 
 249         assertFalse(value5.equals(value6));
 250 
 251         value6 =
 252                 new ParsedValueImpl<ParsedValue[][],Number[][]>(
 253                     new ParsedValueImpl[][] {
 254                         new ParsedValueImpl[] {
 255                             new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 256                             new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 257                         },
 258                         null
 259                     }, null
 260                 );
 261 
 262         assertFalse(value5.equals(value6));
 263 
 264 
 265     }
 266 
 267     @Test
 268     public void test_RT_24614() {
 269 
 270         ParsedValue<String,String> value1 =
 271                 new ParsedValueImpl<>("FOO", null);
 272 
 273         ParsedValue<String,String> value2 =
 274                 new ParsedValueImpl<>("FOO", null);
 275 
 276         assertTrue(value1.equals(value2));
 277 
 278         value1 =
 279                 new ParsedValueImpl<>("FOO", null);
 280 
 281         value2 =
 282                 new ParsedValueImpl<>("foo", null);
 283 
 284         assertTrue(value1.equals(value2));
 285 
 286         ParsedValueImpl<ParsedValue<?,Size>,Number> value3 =
 287                 new ParsedValueImpl<>(
 288                         new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.PX), null),
 289                         SizeConverter.getInstance());
 290 
 291         value1 =
 292                 new ParsedValueImpl<>("FOO", null);
 293 
 294         assertFalse(value1.equals(value3));
 295         assertFalse(value3.equals(value1));
 296 
 297         ParsedValue<ParsedValue[],String[]> value4 =
 298                 new ParsedValueImpl<>(
 299                         new ParsedValueImpl[] {
 300                                 new ParsedValueImpl<String,String>("FOO", null),
 301                                 new ParsedValueImpl<String,String>("BAR", null)
 302                         }, null
 303                 );
 304 
 305         ParsedValue<ParsedValue[],String[]> value5 =
 306                 new ParsedValueImpl<>(
 307                         new ParsedValueImpl[] {
 308                                 new ParsedValueImpl<String,String>("foo", null),
 309                                 new ParsedValueImpl<String,String>("bar", null)
 310                         }, null
 311                 );
 312         assertTrue(value4.equals(value5));
 313         assertTrue(value5.equals(value4));
 314 
 315         value4 =
 316                 new ParsedValueImpl<>(
 317                         new ParsedValueImpl[] {
 318                                 new ParsedValueImpl<String,String>("FOO", null),
 319                                 new ParsedValueImpl<String,String>("BAR", null)
 320                         }, null
 321                 );
 322 
 323         value5 =
 324                 new ParsedValueImpl<>(
 325                         new ParsedValueImpl[] {
 326                                 new ParsedValueImpl<String,String>("foo", null),
 327                                 new ParsedValueImpl<String,String>("foo", null)
 328                         }, null
 329                 );
 330         assertFalse(value4.equals(value5));
 331         assertFalse(value5.equals(value4));
 332 
 333         ParsedValue<ParsedValue[][],String[][]> value6 =
 334                 new ParsedValueImpl<>(
 335                         new ParsedValueImpl[][] {
 336                                 new ParsedValueImpl[] {
 337                                         new ParsedValueImpl<String,String>("foo", null),
 338                                         new ParsedValueImpl<String,String>("bar", null)
 339                                 },
 340                                 new ParsedValueImpl[] {
 341                                         new ParsedValueImpl<String,String>("FOO", null),
 342                                         new ParsedValueImpl<String,String>("BAR", null)
 343                                 }
 344                         }, null
 345                 );
 346 
 347         ParsedValue<ParsedValue[][],String[][]> value7 =
 348                 new ParsedValueImpl<>(
 349                         new ParsedValueImpl[][] {
 350                                 new ParsedValueImpl[] {
 351                                         new ParsedValueImpl<String,String>("FOO", null),
 352                                         new ParsedValueImpl<String,String>("BAR", null)
 353                                 },
 354                                 new ParsedValueImpl[] {
 355                                         new ParsedValueImpl<String,String>("foo", null),
 356                                         new ParsedValueImpl<String,String>("bar", null)
 357                                 }
 358                         }, null
 359                 );
 360 
 361         assertTrue(value6.equals(value7));
 362         assertTrue(value7.equals(value6));
 363 
 364         value6 =
 365                 new ParsedValueImpl<>(
 366                         new ParsedValueImpl[][] {
 367                                 new ParsedValueImpl[] {
 368                                         new ParsedValueImpl<String,String>("foo", null),
 369                                         new ParsedValueImpl<String,String>("bar", null)
 370                                 },
 371                                 new ParsedValueImpl[] {
 372                                         new ParsedValueImpl<String,String>("FOO", null),
 373                                         new ParsedValueImpl<String,String>("BAR", null)
 374                                 }
 375                         }, null
 376                 );
 377 
 378         value7 =
 379                 new ParsedValueImpl<>(
 380                         new ParsedValueImpl[][] {
 381                                 new ParsedValueImpl[] {
 382                                         new ParsedValueImpl<String,String>("FOO", null),
 383                                         new ParsedValueImpl<String,String>("BAR", null)
 384                                 },
 385                                 new ParsedValueImpl[] {
 386                                         new ParsedValueImpl<String,String>("foo", null),
 387                                         new ParsedValueImpl<String,String>("foo", null)
 388                                 }
 389                         }, null
 390                 );
 391 
 392         assertFalse(value6.equals(value7));
 393         assertFalse(value7.equals(value6));
 394     }
 395     
 396     private void writeBinary(ParsedValueImpl parsedValue) {
 397 
 398         try {
 399             StringStore stringStore = new StringStore();
 400             ByteArrayOutputStream baos = new ByteArrayOutputStream();
 401             DataOutputStream dos = new DataOutputStream(baos);
 402             parsedValue.writeBinary(dos, stringStore);
 403             dos.close();
 404         } catch (IOException ioe) {
 405             org.junit.Assert.fail(parsedValue.toString());
 406         }
 407         
 408     }
 409     
 410     /**
 411      * Test of writeBinary method, of class ParsedValueImpl.
 412      */
 413     @Test
 414     public void testWriteReadBinary() throws Exception {
 415         Font font = Font.getDefault();
 416         Size size = new Size(1.0, SizeUnits.EM);
 417         
 418         ParsedValueImpl parsedValue =
 419             new ParsedValueImpl<ParsedValue<?,Size>,Number>(
 420                 new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 421                 SizeConverter.getInstance());
 422 
 423         writeBinary(parsedValue);
 424         
 425         parsedValue =
 426                 new ParsedValueImpl<ParsedValue[],Number[]>(
 427                     new ParsedValueImpl[] {
 428                         new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 429                         new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 430                     }, SizeConverter.SequenceConverter.getInstance()
 431                 );
 432 
 433         writeBinary(parsedValue);
 434         
 435         parsedValue =
 436                 new ParsedValueImpl<ParsedValue[][],Number[][]>(
 437                     new ParsedValueImpl[][] {
 438                         new ParsedValueImpl[] {
 439                             new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 440                             new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 441                         },
 442                         new ParsedValueImpl[] {
 443                             new ParsedValueImpl<Size,Size>(new Size(3.0, SizeUnits.EM), null),
 444                             new ParsedValueImpl<Size,Size>(new Size(4.0, SizeUnits.EM), null)
 445                         }
 446                     }, null
 447                 );
 448 
 449         writeBinary(parsedValue);
 450         
 451         parsedValue =
 452                 new ParsedValueImpl<ParsedValue[][],Number[][]>(
 453                     new ParsedValueImpl[][] {
 454                         new ParsedValueImpl[] {
 455                             new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 456                             new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 457                         },
 458                         new ParsedValueImpl[] {
 459                             new ParsedValueImpl<Size,Size>(new Size(3.0, SizeUnits.EM), null),
 460                             null
 461                         }
 462                     }, null
 463                 );
 464 
 465         writeBinary(parsedValue);
 466         
 467         parsedValue =
 468                 new ParsedValueImpl<ParsedValue[][],Number[][]>(
 469                     new ParsedValueImpl[][] {
 470                         new ParsedValueImpl[] {
 471                             new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 472                             new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 473                         },
 474                         null
 475                     }, null
 476                 );
 477 
 478         writeBinary(parsedValue);
 479         
 480     }
 481 
 482     private void writeAndReadBinary(ParsedValueImpl<?,?> parsedValue) {
 483 
 484         try {
 485             StringStore stringStore = new StringStore();
 486             ByteArrayOutputStream baos = new ByteArrayOutputStream();
 487             DataOutputStream dos = new DataOutputStream(baos);
 488             parsedValue.writeBinary(dos, stringStore);
 489             dos.close();
 490             String[] strings = stringStore.strings.toArray(new String[]{});
 491             ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
 492             DataInputStream dis = new DataInputStream(bais);
 493             ParsedValue<?,?> pv = ParsedValueImpl.readBinary(Stylesheet.BINARY_CSS_VERSION, dis, strings);
 494             org.junit.Assert.assertEquals(parsedValue, pv);
 495         } catch (IOException ioe) {
 496             System.err.println(ioe);
 497             org.junit.Assert.fail(parsedValue.toString());
 498         }
 499         
 500     }    
 501     /**
 502      * Test of readBinary method, of class ParsedValueImpl.
 503      */
 504     @Test
 505     public void testReadBinary() throws Exception {
 506         Font font = Font.getDefault();
 507         Size size = new Size(1.0, SizeUnits.EM);
 508         
 509         ParsedValueImpl parsedValue =
 510             new ParsedValueImpl<ParsedValue<?,Size>,Number>(
 511                 new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 512                 SizeConverter.getInstance());
 513 
 514         writeAndReadBinary(parsedValue);
 515         
 516         parsedValue =
 517                 new ParsedValueImpl<ParsedValue[],Number[]>(
 518                     new ParsedValueImpl[] {
 519                         new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 520                         new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 521                     }, SizeConverter.SequenceConverter.getInstance()
 522                 );
 523 
 524         writeAndReadBinary(parsedValue);
 525         
 526         parsedValue =
 527                 new ParsedValueImpl<ParsedValue[][],Number[][]>(
 528                     new ParsedValueImpl[][] {
 529                         new ParsedValueImpl[] {
 530                             new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 531                             new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 532                         },
 533                         new ParsedValueImpl[] {
 534                             new ParsedValueImpl<Size,Size>(new Size(3.0, SizeUnits.EM), null),
 535                             new ParsedValueImpl<Size,Size>(new Size(4.0, SizeUnits.EM), null)
 536                         }
 537                     }, null
 538                 );
 539 
 540         writeAndReadBinary(parsedValue);
 541         
 542         parsedValue =
 543                 new ParsedValueImpl<ParsedValue[][],Number[][]>(
 544                     new ParsedValueImpl[][] {
 545                         new ParsedValueImpl[] {
 546                             new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 547                             new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 548                         },
 549                         new ParsedValueImpl[] {
 550                             new ParsedValueImpl<Size,Size>(new Size(3.0, SizeUnits.EM), null),
 551                             null
 552                         }
 553                     }, null
 554                 );
 555 
 556         writeAndReadBinary(parsedValue);
 557         
 558         parsedValue =
 559                 new ParsedValueImpl<ParsedValue[][],Number[][]>(
 560                     new ParsedValueImpl[][] {
 561                         new ParsedValueImpl[] {
 562                             new ParsedValueImpl<Size,Size>(new Size(1.0, SizeUnits.EM), null),
 563                             new ParsedValueImpl<Size,Size>(new Size(2.0, SizeUnits.EM), null)
 564                         },
 565                         null
 566                     }, null
 567                 );
 568 
 569         writeAndReadBinary(parsedValue);
 570     }
 571 }