/*
 * 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.apache.metron.stellar.common;

import com.google.common.collect.ImmutableList;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

public class StellarAssignmentTest {

  @Test
  public void testAssignment() {
    for(String statement : ImmutableList.of( "foo := bar + grok"
                                           , "foo   := bar + grok"
                                           , "foo := bar + grok   "
                                           )
       )
    {
      StellarAssignment assignment = StellarAssignment.from(statement);
      assertEquals("foo", assignment.getKey());
      assertEquals("foo", assignment.getVariable());
      assertEquals("bar + grok", assignment.getStatement());
      assertEquals("bar + grok", assignment.getValue());
    }
  }

  @Test
  public void testNonAssignment() {
    for(String statement : ImmutableList.of( "bar + grok"
                                           , "  bar + grok"
                                           , "bar + grok   "
    )
            )
    {
      StellarAssignment assignment = StellarAssignment.from(statement);
      assertNull( assignment.getKey());
      assertNull( assignment.getVariable());
      assertEquals("bar + grok", assignment.getStatement());
      assertEquals("bar + grok", assignment.getValue());
    }
  }

  @Test
  public void testImmutability() {
    StellarAssignment assignment = StellarAssignment.from("foo := bar");
    assertThrows(UnsupportedOperationException.class, () -> assignment.setValue("myval"));
  }
}
