/*
 * 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.
 */

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

import org.apache.flink.statefun.sdk.java.ValueSpec;
import org.apache.flink.statefun.sdk.java.types.Types;
import org.junit.Test;

public class ValueSpecTest {

  @Test
  public void exampleUsage() {
    final ValueSpec<Integer> spec = ValueSpec.named("state_name").withIntType();

    assertThat(spec.name(), is("state_name"));
    assertThat(spec.type(), is(Types.integerType()));
  }

  @Test(expected = IllegalArgumentException.class)
  public void stateNameWithSpaces() {
    ValueSpec.named("bad state name").withIntType();
  }

  @Test(expected = IllegalArgumentException.class)
  public void stateNameWithInvalidStartChar() {
    ValueSpec.named("123bad_state_name").withIntType();
  }

  @Test(expected = IllegalArgumentException.class)
  public void stateNameWithInvalidPartChar() {
    ValueSpec.named("bad!_state_name").withIntType();
  }
}
