/*
 * 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 org.netbeans.modules.web.clientproject.api.util;

import java.io.File;
import java.util.concurrent.atomic.AtomicInteger;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.netbeans.junit.NbTestCase;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;

public class WatchedFileTest extends NbTestCase {


    public WatchedFileTest(String name) {
        super(name);
    }

    @Override
    protected void setUp() throws Exception {
        clearWorkDir();
    }

    public void testExists() throws Exception {
        String name = "test.txt";
        FileObject dir = getDir();
        WatchedFile watchedFile = WatchedFile.create(name, dir);
        assertFalse(watchedFile.exists());
        ChangeListenerImpl changeListener = new ChangeListenerImpl();
        watchedFile.addChangeListener(changeListener);
        assertEquals(0, changeListener.getEventCount());
        FileUtil.createData(dir, name);
        // wait for fs
        Thread.sleep(1000);
        assertTrue(watchedFile.exists());
        assertEquals(1, changeListener.getEventCount());
    }

    public void testInvalidDirectory() throws Exception {
        String name = "test.txt";
        FileObject dir = getDir();
        dir.delete();
        assertFalse(dir.isValid());
        WatchedFile watchedFile = WatchedFile.create(name, dir);
        assertFalse(watchedFile.exists());
        ChangeListenerImpl changeListener = new ChangeListenerImpl();
        watchedFile.addChangeListener(changeListener);
    }

    private FileObject getDir() throws Exception {
        FileObject folder = FileUtil.createFolder(new File(getWorkDir(), "testdir"));
        assertTrue(folder.isFolder());
        assertTrue(folder.isValid());
        return folder;
    }

    //~ Inner classes

    private static final class ChangeListenerImpl implements ChangeListener {

        private final AtomicInteger eventCount = new AtomicInteger();

        @Override
        public void stateChanged(ChangeEvent e) {
            eventCount.incrementAndGet();
        }

        public int getEventCount() {
            return eventCount.get();
        }

    }

}
