1/*
2 * Copyright (c) 2016, 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.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24import java.beans.BeanInfo;
25import java.beans.BeanProperty;
26import java.beans.IntrospectionException;
27import java.beans.Introspector;
28import java.beans.PropertyChangeListener;
29import java.beans.PropertyDescriptor;
30
31import java.util.Arrays;
32
33
34/**
35 * @test
36 * @bug 8132973 8132732 8155013 8154958
37 * @summary Some check for BeanProperty annotation
38 * @author a.stepanov
39 * @run main AnonymousClassBeanPropertyTest
40 */
41//TODO in final revision each test should have only one checkInfo/checkAlternate
42public class AnonymousClassBeanPropertyTest {
43
44    private final static String  DESCRIPTION = "TEST";
45    private final static boolean BOUND       = true;
46    private final static boolean EXPERT      = false;
47    private final static boolean HIDDEN      = true;
48    private final static boolean PREFERRED   = false;
49    private final static boolean REQUIRED    = true;
50    private final static boolean UPDATE      = false;
51
52    private final static double X = java.lang.Math.PI;
53
54    private final static String
55        V_NAME  = "java.lang.Math.PI",
56        V_SHORT = "PI",
57        V = Double.toString(X);
58
59    private final static String DESCRIPTION_2 = "XYZ";
60
61
62    // ---------- test cases (interfaces) ----------
63
64    public interface IPublic {
65        double getX();
66    }
67
68    private interface IGet {
69        double getX();
70    }
71
72    private interface ISet {
73        void setX(double v);
74    }
75
76    private interface IGetByIndex {
77        double getX(int i);
78    }
79
80    private interface ISetByIndex {
81        void setX(int i, double v);
82    }
83
84    private interface IGetArray {
85        double[] getX();
86    }
87
88    private interface ISetArray {
89        void setX(double a[]);
90    }
91
92    private interface IGetBoth {
93        double   getX(int i);
94        double[] getX();
95    }
96
97    private interface ISetBoth {
98        void setX(int i, double v);
99        void setX(double a[]);
100    }
101
102    private interface IGetSet {
103        double getX();
104        void setX(double v);
105    }
106
107    private interface IGetSetByIndex {
108        double getX(int i);
109        void setX(int i, double v);
110    }
111
112    private interface IGetSetBoth {
113        double   getX(int i);
114        double[] getX();
115        void setX(int i, double v);
116        void setX(double a[]);
117    }
118
119    private interface IIs {
120        boolean isX();
121    }
122
123
124    // ---------- checks ----------
125
126    private static boolean check(String what, boolean v, boolean ref) {
127
128        boolean ok = (v == ref);
129        if (!ok) { System.out.println(
130            "invalid " + what + ": " + v + ", expected: " + ref); }
131        return ok;
132    }
133
134    private static boolean checkInfo(Class<?> c, String what, boolean checkVals) {
135
136        BeanInfo i;
137        try { i = Introspector.getBeanInfo(c, Object.class); }
138        catch (IntrospectionException e) { throw new RuntimeException(e); }
139
140        System.out.println("\nchecking info for " + what);
141
142        PropertyDescriptor descriptors[] = i.getPropertyDescriptors();
143        int nd = descriptors.length;
144        if (nd != 1) {
145            System.out.println("invalid number of descriptors: " + nd);
146            return false;
147        }
148
149        PropertyDescriptor d = descriptors[0];
150
151        String descr = d.getShortDescription();
152        boolean ok = descr.equals(DESCRIPTION);
153        if (!ok) { System.out.println("invalid description: " + descr +
154                ", expected: " + DESCRIPTION); }
155
156        ok &= check("isBound",  d.isBound(),  BOUND);
157        ok &= check("isExpert", d.isExpert(), EXPERT);
158        ok &= check("isHidden", d.isHidden(), HIDDEN);
159        ok &= check("isPreferred", d.isPreferred(), PREFERRED);
160        ok &= check("required", (boolean) d.getValue("required"), REQUIRED);
161        ok &= check("visualUpdate",
162            (boolean) d.getValue("visualUpdate"), UPDATE);
163
164        if (!checkVals) { return ok; }
165
166        Object vals[] = (Object[]) d.getValue("enumerationValues");
167        if (vals == null) {
168            System.out.println("null enumerationValues");
169            return false;
170        }
171
172        if (vals.length == 0) {
173            System.out.println("empty enumerationValues");
174            return false;
175        }
176
177        boolean okVals = (
178            (vals.length == 3) &&
179             vals[0].toString().equals(V_SHORT) &&
180             vals[1].toString().equals(V)       &&
181             vals[2].toString().equals(V_NAME));
182
183        if (!okVals) {
184            System.out.println("invalid enumerationValues:");
185            for (Object v: vals) { System.out.println(v.toString()); }
186        }
187
188        return (ok && okVals);
189    }
190
191    private static boolean checkAlternativeInfo(Class<?> c, String what) {
192
193        BeanInfo i;
194        try { i = Introspector.getBeanInfo(c, Object.class); }
195        catch (IntrospectionException e) { throw new RuntimeException(e); }
196
197        System.out.println("checking alternative info for " + what);
198
199        PropertyDescriptor descriptors[] = i.getPropertyDescriptors();
200        int nd = descriptors.length;
201        if (nd != 1) {
202            System.out.println("invalid number of descriptors: " + nd);
203            return false;
204        }
205
206        PropertyDescriptor d = descriptors[0];
207
208        String descr = d.getShortDescription();
209        boolean ok = descr.equals(DESCRIPTION_2);
210        if (!ok) { System.out.println("invalid alternative description: " +
211            descr + ", expected: " + DESCRIPTION_2); }
212
213        ok &= check("isBound",  d.isBound(),  !BOUND);
214        ok &= check("isExpert", d.isExpert(), !EXPERT);
215        ok &= check("isHidden", d.isHidden(), !HIDDEN);
216        ok &= check("isPreferred", d.isPreferred(), !PREFERRED);
217        ok &= check("required", (boolean) d.getValue("required"), !REQUIRED);
218        ok &= check("visualUpdate",
219            (boolean) d.getValue("visualUpdate"), !UPDATE);
220
221        Object vals[] = (Object[]) d.getValue("enumerationValues");
222        if (vals != null && vals.length > 0) {
223            System.out.println("non-empty enumerationValues:");
224            for (Object v: vals) { System.out.print(v.toString()); }
225            System.out.println();
226            return false;
227        }
228
229        return ok;
230    }
231
232
233
234    // ---------- run tests ----------
235
236    public static void main(String[] args) {
237
238        boolean passed = true, ok, ok2;
239
240        //----------------------------------------------------------------------
241
242        // TODO: please uncomment/update after 8154958 fix
243        /*
244        IPublic testPublic = new IPublic() {
245            @BeanProperty(
246                description  = DESCRIPTION,
247                bound        = BOUND,
248                expert       = EXPERT,
249                hidden       = HIDDEN,
250                preferred    = PREFERRED,
251                required     = REQUIRED,
252                visualUpdate = UPDATE,
253                enumerationValues = {V_NAME})
254            @Override
255            public double getX() { return X; }
256
257            public void addPropertyChangeListener(PropertyChangeListener l)    {}
258            public void removePropertyChangeListener(PropertyChangeListener l) {}
259        };
260        ok = checkInfo(testPublic.getClass(), "IPublic", true);
261        System.out.println("OK = " + ok);
262        passed = passed && ok;
263        */
264
265        //----------------------------------------------------------------------
266
267        IGet testGet = new IGet() {
268            @BeanProperty(
269                description  = DESCRIPTION,
270                bound        = BOUND,
271                expert       = EXPERT,
272                hidden       = HIDDEN,
273                preferred    = PREFERRED,
274                required     = REQUIRED,
275                visualUpdate = UPDATE,
276                enumerationValues = {V_NAME})
277            @Override
278            public double getX() { return X; }
279
280            public void addPropertyChangeListener(PropertyChangeListener l)    {}
281            public void removePropertyChangeListener(PropertyChangeListener l) {}
282        };
283        ok = checkInfo(testGet.getClass(), "IGet", true);
284        System.out.println("OK = " + ok);
285        passed = passed && ok;
286
287        //----------------------------------------------------------------------
288
289        ISet testSet = new ISet() {
290
291            private double x;
292
293            @BeanProperty(
294                description  = DESCRIPTION,
295                bound        = BOUND,
296                expert       = EXPERT,
297                hidden       = HIDDEN,
298                preferred    = PREFERRED,
299                required     = REQUIRED,
300                visualUpdate = UPDATE,
301                enumerationValues = {V_NAME})
302            @Override
303            public void setX(double v) { x = v; }
304
305            public void addPropertyChangeListener(PropertyChangeListener l)    {}
306            public void removePropertyChangeListener(PropertyChangeListener l) {}
307        };
308        ok = checkInfo(testSet.getClass(), "ISet", true);
309        System.out.println("OK = " + ok);
310        passed = passed && ok;
311
312        //----------------------------------------------------------------------
313
314        IGetByIndex testGetByIndex = new IGetByIndex() {
315
316            private final double x[] = {X, X};
317
318            @BeanProperty(
319                description  = DESCRIPTION,
320                bound        = BOUND,
321                expert       = EXPERT,
322                hidden       = HIDDEN,
323                preferred    = PREFERRED,
324                required     = REQUIRED,
325                visualUpdate = UPDATE,
326                enumerationValues = {V_NAME})
327            @Override
328            public double getX(int i) { return x[i]; }
329
330            public void addPropertyChangeListener(PropertyChangeListener l)    {}
331            public void removePropertyChangeListener(PropertyChangeListener l) {}
332        };
333        ok = checkInfo(testGetByIndex.getClass(), "IGetByIndex", true);
334        System.out.println("OK = " + ok);
335        passed = passed && ok;
336
337        //----------------------------------------------------------------------
338
339        ISetByIndex testSetByIndex = new ISetByIndex() {
340
341            private final double x[] = {X, X, X};
342
343            @BeanProperty(
344                description  = DESCRIPTION,
345                bound        = BOUND,
346                expert       = EXPERT,
347                hidden       = HIDDEN,
348                preferred    = PREFERRED,
349                required     = REQUIRED,
350                visualUpdate = UPDATE,
351                enumerationValues = {V_NAME})
352            @Override
353            public void setX(int i, double v) { x[i] = v; }
354
355            public void addPropertyChangeListener(PropertyChangeListener l)    {}
356            public void removePropertyChangeListener(PropertyChangeListener l) {}
357        };
358        ok = checkInfo(testSetByIndex.getClass(), "ISetByIndex", true);
359        System.out.println("OK = " + ok);
360        passed = passed && ok;
361
362        //----------------------------------------------------------------------
363
364        // TODO: please uncomment/update after 8155013 fix
365        /*
366        IGetArray testGetArray = new IGetArray() {
367
368            private final double x[] = {X, X};
369
370            @BeanProperty(
371                description  = DESCRIPTION,
372                bound        = BOUND,
373                expert       = EXPERT,
374                hidden       = HIDDEN,
375                preferred    = PREFERRED,
376                required     = REQUIRED,
377                visualUpdate = UPDATE,
378                enumerationValues = {V_NAME})
379            @Override
380            public double[] getX() { return x; }
381
382            public void addPropertyChangeListener(PropertyChangeListener l)    {}
383            public void removePropertyChangeListener(PropertyChangeListener l) {}
384        };
385        ok = checkInfo(testGetArray.getClass(), "IGetArray", true);
386        System.out.println("OK = " + ok);
387        passed = passed && ok;
388        */
389
390        //----------------------------------------------------------------------
391
392        // TODO: please uncomment/update after 8155013 fix
393        /*
394        ISetArray testSetArray = new ISetArray() {
395
396            private double x[];
397
398            @BeanProperty(
399                description  = DESCRIPTION,
400                bound        = BOUND,
401                expert       = EXPERT,
402                hidden       = HIDDEN,
403                preferred    = PREFERRED,
404                required     = REQUIRED,
405                visualUpdate = UPDATE,
406                enumerationValues = {V_NAME})
407            @Override
408            public void setX(double a[]) { x = Arrays.copyOf(a, a.length); }
409
410            public void addPropertyChangeListener(PropertyChangeListener l)    {}
411            public void removePropertyChangeListener(PropertyChangeListener l) {}
412        };
413        ok = checkInfo(testSetArray.getClass(), "ISetArray", true);
414        System.out.println("OK = " + ok);
415        passed = passed && ok;
416        */
417
418        //----------------------------------------------------------------------
419
420        IGetBoth testGetBoth_1 = new IGetBoth() {
421
422            private final double x[] = {X, X};
423
424            @BeanProperty(
425                description  = DESCRIPTION,
426                bound        = BOUND,
427                expert       = EXPERT,
428                hidden       = HIDDEN,
429                preferred    = PREFERRED,
430                required     = REQUIRED,
431                visualUpdate = UPDATE,
432                enumerationValues = {V_NAME})
433            @Override
434            public double getX(int i) { return x[i]; }
435            @Override
436            public double[] getX() { return x; }
437
438            public void addPropertyChangeListener(PropertyChangeListener l)    {}
439            public void removePropertyChangeListener(PropertyChangeListener l) {}
440        };
441        ok = checkInfo(testGetBoth_1.getClass(), "IGetBoth-1", true);
442        System.out.println("OK = " + ok);
443        passed = passed && ok;
444
445        // TODO: please uncomment/update after 8155013 fix
446        /*
447        IGetBoth testGetBoth_2 = new IGetBoth() {
448
449            private final double x[] = {X, X};
450
451            @Override
452            public double getX(int i) { return x[i]; }
453            @BeanProperty(
454                description  = DESCRIPTION,
455                bound        = BOUND,
456                expert       = EXPERT,
457                hidden       = HIDDEN,
458                preferred    = PREFERRED,
459                required     = REQUIRED,
460                visualUpdate = UPDATE,
461                enumerationValues = {V_NAME})
462            @Override
463            public double[] getX() { return x; }
464
465            public void addPropertyChangeListener(PropertyChangeListener l)    {}
466            public void removePropertyChangeListener(PropertyChangeListener l) {}
467        };
468        ok = checkInfo(testGetBoth_2.getClass(), "IGetBoth-2", true);
469        System.out.println("OK = " + ok);
470        passed = passed && ok;
471        */
472
473        // TODO: please uncomment/update after 8132732 fix
474        /*
475        IGetBoth testGetBoth_3 = new IGetBoth() {
476
477            private final double x[] = {X, X};
478
479            @BeanProperty(
480                description  = DESCRIPTION,
481                bound        = BOUND,
482                expert       = EXPERT,
483                hidden       = HIDDEN,
484                preferred    = PREFERRED,
485                required     = REQUIRED,
486                visualUpdate = UPDATE,
487                enumerationValues = {V_NAME})
488            @Override
489            public double getX(int i) { return x[i]; }
490            @BeanProperty(
491                description  = DESCRIPTION_2,
492                bound        = !BOUND,
493                expert       = !EXPERT,
494                hidden       = !HIDDEN,
495                preferred    = !PREFERRED,
496                required     = !REQUIRED,
497                visualUpdate = !UPDATE)
498            @Override
499            public double[] getX() { return x; }
500
501            public void addPropertyChangeListener(PropertyChangeListener l)    {}
502            public void removePropertyChangeListener(PropertyChangeListener l) {}
503        };
504        ok = checkInfo(testGetBoth_3.getClass(), "IGetBoth-3", true);
505        System.out.println("OK = " + ok);
506        ok2 = checkAlternativeInfo(testGetBoth_3.getClass(), "IGetBoth-3");
507        System.out.println("OK = " + ok2);
508        passed = passed && (ok || ok2);
509        */
510
511        //----------------------------------------------------------------------
512
513        ISetBoth testSetBoth_1 = new ISetBoth() {
514
515            private double x[] = new double[3];
516
517            @BeanProperty(
518                description  = DESCRIPTION,
519                bound        = BOUND,
520                expert       = EXPERT,
521                hidden       = HIDDEN,
522                preferred    = PREFERRED,
523                required     = REQUIRED,
524                visualUpdate = UPDATE,
525                enumerationValues = {V_NAME})
526            @Override
527            public void setX(int i, double v) { x[i] = v; }
528            @Override
529            public void setX(double[] a) { x = Arrays.copyOf(a, a.length); }
530
531            public void addPropertyChangeListener(PropertyChangeListener l)    {}
532            public void removePropertyChangeListener(PropertyChangeListener l) {}
533        };
534        ok = checkInfo(testSetBoth_1.getClass(), "ISetBoth-1", true);
535        System.out.println("OK = " + ok);
536        passed = passed && ok;
537
538        // TODO: please uncomment/update after 8155013 fix
539        /*
540        ISetBoth testSetBoth_2 = new ISetBoth() {
541
542            private double x[] = new double[3];
543
544            @Override
545            public void setX(int i, double v) { x[i] = v; }
546            @BeanProperty(
547                description  = DESCRIPTION,
548                bound        = BOUND,
549                expert       = EXPERT,
550                hidden       = HIDDEN,
551                preferred    = PREFERRED,
552                required     = REQUIRED,
553                visualUpdate = UPDATE,
554                enumerationValues = {V_NAME})
555            @Override
556            public void setX(double[] a) { x = Arrays.copyOf(a, a.length); }
557
558            public void addPropertyChangeListener(PropertyChangeListener l)    {}
559            public void removePropertyChangeListener(PropertyChangeListener l) {}
560        };
561        ok = checkInfo(testSetBoth_2.getClass(), "ISetBoth-2", true);
562        System.out.println("OK = " + ok);
563        passed = passed && ok;
564        */
565
566        // TODO: please uncomment/update after 8132732 fix
567        /*
568        ISetBoth testSetBoth_3 = new ISetBoth() {
569
570            private double x[] = {X, X};
571
572            @BeanProperty(
573                description  = DESCRIPTION,
574                bound        = BOUND,
575                expert       = EXPERT,
576                hidden       = HIDDEN,
577                preferred    = PREFERRED,
578                required     = REQUIRED,
579                visualUpdate = UPDATE,
580                enumerationValues = {V_NAME})
581            @Override
582            public void setX(int i, double v) { x[i] = v; }
583            @BeanProperty(
584                description  = DESCRIPTION_2,
585                bound        = !BOUND,
586                expert       = !EXPERT,
587                hidden       = !HIDDEN,
588                preferred    = !PREFERRED,
589                required     = !REQUIRED,
590                visualUpdate = !UPDATE)
591            @Override
592            public void setX(double[] a) { x = Arrays.copyOf(a, a.length); }
593
594            public void addPropertyChangeListener(PropertyChangeListener l)    {}
595            public void removePropertyChangeListener(PropertyChangeListener l) {}
596        };
597        ok = checkInfo(testSetBoth_3.getClass(), "ISetBoth-3", true);
598        System.out.println("OK = " + ok);
599        ok2 = checkAlternativeInfo(testSetBoth_3.getClass(), "ISetBoth-3");
600        System.out.println("OK = " + ok2);
601        passed = passed && (ok || ok2);
602        */
603
604        //----------------------------------------------------------------------
605
606        IGetSet testGetSet_1 = new IGetSet() {
607
608            private double x;
609
610            @BeanProperty(
611                description  = DESCRIPTION,
612                bound        = BOUND,
613                expert       = EXPERT,
614                hidden       = HIDDEN,
615                preferred    = PREFERRED,
616                required     = REQUIRED,
617                visualUpdate = UPDATE,
618                enumerationValues = {V_NAME})
619            @Override
620            public double getX() { return x; }
621            @Override
622            public void setX(double v) { x = v; }
623
624            public void addPropertyChangeListener(PropertyChangeListener l)    {}
625            public void removePropertyChangeListener(PropertyChangeListener l) {}
626        };
627        ok = checkInfo(testGetSet_1.getClass(), "IGetSet-1", true);
628        System.out.println("OK = " + ok);
629        passed = passed && ok;
630
631
632        IGetSet testGetSet_2 = new IGetSet() {
633
634            private double x;
635
636            @Override
637            public double getX() { return x; }
638            @BeanProperty(
639                description  = DESCRIPTION,
640                bound        = BOUND,
641                expert       = EXPERT,
642                hidden       = HIDDEN,
643                preferred    = PREFERRED,
644                required     = REQUIRED,
645                visualUpdate = UPDATE,
646                enumerationValues = {V_NAME})
647            @Override
648            public void setX(double v) { x = v; }
649
650            public void addPropertyChangeListener(PropertyChangeListener l)    {}
651            public void removePropertyChangeListener(PropertyChangeListener l) {}
652        };
653        ok = checkInfo(testGetSet_2.getClass(), "IGetSet-2", true);
654        System.out.println("OK = " + ok);
655        passed = passed && ok;
656
657        IGetSet testGetSet_3 = new IGetSet() {
658
659            private double x;
660
661            @Override
662            @BeanProperty(
663                description  = DESCRIPTION,
664                bound        = BOUND,
665                expert       = EXPERT,
666                hidden       = HIDDEN,
667                preferred    = PREFERRED,
668                required     = REQUIRED,
669                visualUpdate = UPDATE,
670                enumerationValues = {V_NAME})
671            public double getX() { return x; }
672            @BeanProperty(
673                description  = DESCRIPTION_2,
674                bound        = !BOUND,
675                expert       = !EXPERT,
676                hidden       = !HIDDEN,
677                preferred    = !PREFERRED,
678                required     = !REQUIRED,
679                visualUpdate = !UPDATE)
680            @Override
681            public void setX(double v) { x = v; }
682
683            public void addPropertyChangeListener(PropertyChangeListener l)    {}
684            public void removePropertyChangeListener(PropertyChangeListener l) {}
685        };
686        ok = checkInfo(testGetSet_3.getClass(), "IGetSet-3", true);
687        System.out.println("OK = " + ok);
688        passed = passed && ok;
689
690        //----------------------------------------------------------------------
691
692        IGetSetByIndex testGetSetByIndex_1 = new IGetSetByIndex() {
693
694            private final double x[] = {X, X};
695
696            @BeanProperty(
697                description  = DESCRIPTION,
698                bound        = BOUND,
699                expert       = EXPERT,
700                hidden       = HIDDEN,
701                preferred    = PREFERRED,
702                required     = REQUIRED,
703                visualUpdate = UPDATE,
704                enumerationValues = {V_NAME})
705            @Override
706            public double getX(int i) { return x[i]; }
707            @Override
708            public void setX(int i, double v) { x[i] = v; }
709
710            public void addPropertyChangeListener(PropertyChangeListener l)    {}
711            public void removePropertyChangeListener(PropertyChangeListener l) {}
712        };
713        ok = checkInfo(testGetSetByIndex_1.getClass(), "IGetSetByIndex-1", true);
714        System.out.println("OK = " + ok);
715        passed = passed && ok;
716
717
718        IGetSetByIndex testGetSetByIndex_2 = new IGetSetByIndex() {
719
720            private final double x[] = {X, X};
721
722            @Override
723            public double getX(int i) { return x[i]; }
724            @BeanProperty(
725                description  = DESCRIPTION,
726                bound        = BOUND,
727                expert       = EXPERT,
728                hidden       = HIDDEN,
729                preferred    = PREFERRED,
730                required     = REQUIRED,
731                visualUpdate = UPDATE,
732                enumerationValues = {V_NAME})
733            @Override
734            public void setX(int i, double v) { x[i] = v; }
735
736            public void addPropertyChangeListener(PropertyChangeListener l)    {}
737            public void removePropertyChangeListener(PropertyChangeListener l) {}
738        };
739        ok = checkInfo(testGetSetByIndex_2.getClass(), "IGetSetByIndex-2", true);
740        System.out.println("OK = " + ok);
741        passed = passed && ok;
742
743        IGetSetByIndex testGetSetByIndex_3 = new IGetSetByIndex() {
744
745            private double x[] = {X, X};
746
747            @BeanProperty(
748                description  = DESCRIPTION,
749                bound        = BOUND,
750                expert       = EXPERT,
751                hidden       = HIDDEN,
752                preferred    = PREFERRED,
753                required     = REQUIRED,
754                visualUpdate = UPDATE,
755                enumerationValues = {V_NAME})
756            @Override
757            public double getX(int i) {
758                return x[i];
759            }
760            @BeanProperty(
761                description  = DESCRIPTION_2,
762                bound        = !BOUND,
763                expert       = !EXPERT,
764                hidden       = !HIDDEN,
765                preferred    = !PREFERRED,
766                required     = !REQUIRED,
767                visualUpdate = !UPDATE)
768            @Override
769            public void setX(int i, double v) {
770                x[i] = v;
771            }
772
773            public void addPropertyChangeListener(PropertyChangeListener l)    {}
774            public void removePropertyChangeListener(PropertyChangeListener l) {}
775        };
776        ok = checkInfo(testGetSetByIndex_3.getClass(), "IGetSetByIndex-3", true);
777        System.out.println("OK = " + ok);
778        passed = passed && ok;
779
780        //----------------------------------------------------------------------
781
782        // TODO: please uncomment/update after 8155013 fix
783        /*
784        IGetSetBoth testGetSetBoth_1 = new IGetSetBoth() {
785
786            private double x[] = {X, X};
787
788            @Override
789            public double getX(int i) { return x[i]; }
790            @BeanProperty(
791                description  = DESCRIPTION,
792                bound        = BOUND,
793                expert       = EXPERT,
794                hidden       = HIDDEN,
795                preferred    = PREFERRED,
796                required     = REQUIRED,
797                visualUpdate = UPDATE,
798                enumerationValues = {V_NAME})
799            @Override
800            public double[] getX() { return x; }
801            @Override
802            public void setX(int i, double v) { x[i] = v; }
803            @Override
804            public void setX(double[] a) { x = Arrays.copyOf(a, a.length); }
805
806            public void addPropertyChangeListener(PropertyChangeListener l)    {}
807            public void removePropertyChangeListener(PropertyChangeListener l) {}
808        };
809        ok = checkInfo(testGetSetBoth_1.getClass(), "IGetSetBoth-1", true);
810        System.out.println("OK = " + ok);
811        passed = passed && ok;
812        */
813
814        // TODO: please uncomment/update after 8155013 fix
815        /*
816        IGetSetBoth testGetSetBoth_2 = new IGetSetBoth() {
817
818            private double x[] = {X, X};
819
820            @Override
821            public double getX(int i) { return x[i]; }
822            @Override
823            public double[] getX() { return x; }
824            @Override
825            public void setX(int i, double v) { x[i] = v; }
826            @BeanProperty(
827                description  = DESCRIPTION,
828                bound        = BOUND,
829                expert       = EXPERT,
830                hidden       = HIDDEN,
831                preferred    = PREFERRED,
832                required     = REQUIRED,
833                visualUpdate = UPDATE,
834                enumerationValues = {V_NAME})
835            @Override
836            public void setX(double[] a) { x = Arrays.copyOf(a, a.length); }
837
838            public void addPropertyChangeListener(PropertyChangeListener l)    {}
839            public void removePropertyChangeListener(PropertyChangeListener l) {}
840        };
841        ok = checkInfo(testGetSetBoth_2.getClass(), "IGetSetBoth-2", true);
842        System.out.println("OK = " + ok);
843        passed = passed && ok;
844        */
845
846        // TODO: please uncomment/update after 8155013 fix
847        /*
848        IGetSetBoth testGetSetBoth_3 = new IGetSetBoth() {
849
850            private double x[] = {X, X};
851
852            @BeanProperty(
853                description  = DESCRIPTION,
854                bound        = BOUND,
855                expert       = EXPERT,
856                hidden       = HIDDEN,
857                preferred    = PREFERRED,
858                required     = REQUIRED,
859                visualUpdate = UPDATE,
860                enumerationValues = {V_NAME})
861            @Override
862            public double getX(int i) { return x[i]; }
863            @Override
864            public double[] getX() { return x; }
865            @Override
866            public void setX(int i, double v) { x[i] = v; }
867            @BeanProperty(
868                description  = DESCRIPTION_2,
869                bound        = !BOUND,
870                expert       = !EXPERT,
871                hidden       = !HIDDEN,
872                preferred    = !PREFERRED,
873                required     = !REQUIRED,
874                visualUpdate = !UPDATE)
875            @Override
876            public void setX(double[] a) { x = Arrays.copyOf(a, a.length); }
877
878            public void addPropertyChangeListener(PropertyChangeListener l)    {}
879            public void removePropertyChangeListener(PropertyChangeListener l) {}
880        };
881        ok = checkInfo(testGetSetBoth_3.getClass(), "IGetSetBoth-3", true);
882        System.out.println("OK = " + ok);
883        ok2 = checkAlternativeInfo(
884            testGetSetBoth_3.getClass(), "IGetSetBoth-3");
885        System.out.println("OK = " + ok2);
886        passed = passed && (ok || ok2);
887        */
888
889        //----------------------------------------------------------------------
890
891        IIs testIs_1 = new IIs() {
892
893            @BeanProperty(
894                description  = DESCRIPTION,
895                bound        = BOUND,
896                expert       = EXPERT,
897                hidden       = HIDDEN,
898                preferred    = PREFERRED,
899                required     = REQUIRED,
900                visualUpdate = UPDATE)
901            @Override
902            public boolean isX() { return false; }
903
904            public void addPropertyChangeListener(PropertyChangeListener l)    {}
905            public void removePropertyChangeListener(PropertyChangeListener l) {}
906        };
907        ok = checkInfo(testIs_1.getClass(), "IIs-1", false);
908        System.out.println("OK = " + ok);
909        passed = passed && ok;
910
911
912        IIs testIs_2 = new IIs() {
913
914            private boolean b;
915
916            @Override
917            public boolean isX() { return b; }
918
919            @BeanProperty(
920                description  = DESCRIPTION,
921                bound        = BOUND,
922                expert       = EXPERT,
923                hidden       = HIDDEN,
924                preferred    = PREFERRED,
925                required     = REQUIRED,
926                visualUpdate = UPDATE)
927            public void setX(boolean v) { b = v; }
928
929            public void addPropertyChangeListener(PropertyChangeListener l)    {}
930            public void removePropertyChangeListener(PropertyChangeListener l) {}
931        };
932        ok = checkInfo(testIs_2.getClass(), "IIs-2", false);
933        System.out.println("OK = " + ok);
934        passed = passed && ok;
935
936
937        IIs testIs_3 = new IIs() {
938
939            @BeanProperty(
940                description  = DESCRIPTION,
941                bound        = BOUND,
942                expert       = EXPERT,
943                hidden       = HIDDEN,
944                preferred    = PREFERRED,
945                required     = REQUIRED,
946                visualUpdate = UPDATE)
947            @Override
948            public boolean isX() { return false; }
949
950            @BeanProperty(
951                description  = DESCRIPTION_2,
952                bound        = !BOUND,
953                expert       = !EXPERT,
954                hidden       = !HIDDEN,
955                preferred    = !PREFERRED,
956                required     = !REQUIRED,
957                visualUpdate = !UPDATE)
958            public boolean getX() { return false; }
959
960            public void addPropertyChangeListener(PropertyChangeListener l)    {}
961            public void removePropertyChangeListener(PropertyChangeListener l) {}
962        };
963        ok = checkInfo(testIs_3.getClass(), "IIs-3", false);
964        System.out.println("OK = " + ok);
965        ok2 = checkAlternativeInfo(testIs_3.getClass(), "IIs-3");
966        System.out.println("OK = " + ok2);
967        passed = passed && (ok || ok2);
968
969        IIs testIs_4 = new IIs() {
970
971            private boolean b;
972
973            @BeanProperty(
974                description  = DESCRIPTION,
975                bound        = BOUND,
976                expert       = EXPERT,
977                hidden       = HIDDEN,
978                preferred    = PREFERRED,
979                required     = REQUIRED,
980                visualUpdate = UPDATE)
981            @Override
982            public boolean isX() { return b; }
983
984            @BeanProperty(
985                description  = DESCRIPTION_2,
986                bound        = !BOUND,
987                expert       = !EXPERT,
988                hidden       = !HIDDEN,
989                preferred    = !PREFERRED,
990                required     = !REQUIRED,
991                visualUpdate = !UPDATE)
992            public void setX(boolean v) { b = v; }
993
994            public void addPropertyChangeListener(PropertyChangeListener l)    {}
995            public void removePropertyChangeListener(PropertyChangeListener l) {}
996        };
997        ok = checkInfo(testIs_4.getClass(), "IIs-4", false);
998        System.out.println("OK = " + ok);
999        passed = passed && ok;
1000
1001        //----------------------------------------------------------------------
1002
1003
1004        if (!passed) { throw new RuntimeException("test failed"); }
1005        System.out.println("\ntest passed");
1006    }
1007}
1008