Home | History | Annotate | Download | only in gle2
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Eclipse Public License, Version 1.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.eclipse.org/org/documents/epl-v10.php
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.ide.eclipse.adt.internal.editors.layout.gle2;
     17 
     18 import org.eclipse.swt.graphics.Rectangle;
     19 
     20 import java.util.Arrays;
     21 import java.util.Collection;
     22 import java.util.Collections;
     23 import java.util.List;
     24 import java.util.Random;
     25 
     26 import junit.framework.TestCase;
     27 
     28 public class IncludeOverlayTest extends TestCase {
     29 
     30     public void testSubtractRectangles() throws Exception {
     31         checkSubtract(new Rectangle(0, 0, 100, 80), Collections.<Rectangle> emptyList());
     32 
     33         checkSubtract(new Rectangle(0, 0, 100, 80), Arrays.asList(new Rectangle(50, 50, 20, 20)));
     34 
     35         checkSubtract(new Rectangle(0, 0, 100, 80), Arrays.asList(new Rectangle(50, 50, 20, 20),
     36                 new Rectangle(90, 90, 10, 10)));
     37 
     38         checkSubtract(new Rectangle(0, 0, 100, 80), Arrays.asList(new Rectangle(50, 50, 20, 20),
     39                 new Rectangle(90, 90, 10, 10), new Rectangle(0, 0, 10, 10)));
     40 
     41     }
     42 
     43     private void checkSubtract(Rectangle rectangle, List<Rectangle> holes) {
     44         Collection<Rectangle> result = IncludeOverlay.subtractRectangles(rectangle, holes);
     45 
     46         // Do some Monte Carlo testing - pick random coordinates and check that if they
     47         // are within one of the holes then they are not in the result list and vice versa
     48         Random random = new Random(42L);
     49         for (int i = 0; i < 1000; i++) {
     50             int x = random.nextInt(rectangle.width);
     51             int y = random.nextInt(rectangle.height);
     52 
     53             boolean inHole = false;
     54             for (Rectangle hole : holes) {
     55                 if (hole.contains(x, y)) {
     56                     inHole = true;
     57                 }
     58             }
     59 
     60             boolean inResult = false;
     61             for (Rectangle r : result) {
     62                 if (r.contains(x, y)) {
     63                     inResult = true;
     64                     break;
     65                 }
     66             }
     67 
     68             if (inHole == inResult) {
     69                 fail("Wrong result at (" + x + "," + y + ") for rectangle=" + rectangle
     70                         + " and holes=" + holes + " where inHole=inResult="
     71                         + inResult);
     72             }
     73         }
     74     }
     75 }
     76