/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package net.java.html.json.tests;

import net.java.html.json.Models;
import org.netbeans.html.json.tck.KOTest;
import static net.java.html.json.tests.Utils.assertEquals;

/**
 *
 * @author Jaroslav Tulach
 */
public class OperationsTest {
    private JSONik js;
    private Person p;
    
    @KOTest public void syncOperation() {
        js = Models.bind(new JSONik(), Utils.newContext(OperationsTest.class));
        p = new Person("Sitar", "Gitar", Sex.MALE, null);
        js.applyBindings();
        js.setFetched(p);
        Person p = js.getFetched();
        assertEquals("Sitar", p.getFirstName(), "Expecting Sitar immediately: " + p.getFirstName());
        assertEquals(Sex.MALE, p.getSex(), "Expecting MALE immediately: " + p.getSex());
    }
    
    
    @KOTest public void asyncOperation() throws InterruptedException {
        if (js == null) {
            if (Utils.skipIfNoFullJDK()) {
                return;
            }
            
            
            js = Models.bind(new JSONik(), Utils.newContext(OperationsTest.class));
            p = new Person("Sitar", "Gitar", Sex.MALE, null);
            js.applyBindings();

            js.setFetched(null);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    js.assignFetched(p);
                }
            }).start();
        }
    
        Person p = js.getFetched();
        if (p == null) {
            throw new InterruptedException();
        }
        
        assertEquals("Sitar", p.getFirstName(), "Expecting Sitar: " + p.getFirstName());
        assertEquals(Sex.MALE, p.getSex(), "Expecting MALE: " + p.getSex());
    }
}
