package com.intellij.application.options.codeStyle.arrangement.util

import org.junit.Test

import static org.junit.Assert.assertEquals
import static org.junit.Assert.assertNull;

/**
 * @author Denis Zhdanov
 * @since 11/09/2012
 */
class IntObjectMapTest {
  
  @Test
  void "set and get"() {
    def map = new IntObjectMap<Integer>(4)
    map.set(0, 10)
    map.set(1, 11)
    assertEquals(10, map.get(0))
    assertEquals(11, map.get(1))
    assertEquals(2, map.size())
  }

  @Test
  void "set and get with expand"() {
    def map = new IntObjectMap<Integer>(4)
    map.set(5, 10)
    assertEquals(10, map.get(5))
    assertEquals(1, map.size())
  }

  @Test
  void "expand and enough space"() {
    def map = new IntObjectMap<Integer>(4)
    map.set(1, 10)
    map.shiftKeys(0, 2)
    assertNull(map.get(1))
    assertEquals(10, map.get(3))
    assertEquals(1, map.size())
  }

  @Test
  void "expand and not enough space"() {
    def map = new IntObjectMap<Integer>(4)
    map.set(3, 10)
    map.shiftKeys(3, 2)
    assertNull(map.get(3))
    assertEquals(10, map.get(5))
    assertEquals(1, map.size())
  }

  @Test
  void "expand on first insert"() {
    def map = new IntObjectMap<Integer>(4)
    map.set(4, 10)
    assertEquals(10, map.get(4))
    assertEquals(1, map.size())
  }

  @Test
  void "composite"() {
    def map = new IntObjectMap<Integer>(4)
    map.set(1, 10)
    map.set(2, 20)
    map.set(5, 50)
    map.shiftKeys(2, 10)
    
    assertEquals(10, map.get(1))
    assertNull(map.get(2))
    assertNull(map.get(5))
    assertEquals(20, map.get(12))
    assertEquals(50, map.get(15))
    
    map.remove(15)
    assertNull(map.get(15))
    
    map.shiftKeys(0, 10)
    assertNull(map.get(1))
    assertEquals(10, map.get(11))
    assertNull(map.get(15))
    assertEquals(20, map.get(22))
    assertEquals(2, map.size())
  }
  
  @Test
  void "shift backwards starting from null"() {
    def map = new IntObjectMap<Integer>(4)
    map.set(1, 10)
    map.set(3, 30)
    map.set(4, 40)
    
    map.shiftKeys(2, -1)
    assertEquals(10, map.get(1))
    assertEquals(30, map.get(2))
    assertEquals(40, map.get(3))
    assertNull(map.get(4))
    assertEquals(3, map.size())
  }
  
  @Test
  void "clear"() {
    def map = new IntObjectMap<Integer>()
    map.set(1, 10)
    map.set(2, 20)
    assertEquals(2, map.size())
    
    map.clear();
    assertEquals(0, map.size())
    assertNull(map.get(1))
    assertNull(map.get(2))
  }

  @Test
  void "duplicate operations and size"() {
    def map = new IntObjectMap<Integer>()
    
    map.set(1, 10)
    assertEquals(1, map.size())
    assertEquals(10, map.get(1))

    map.set(1, 100)
    assertEquals(1, map.size())
    assertEquals(100, map.get(1))
    
    map.remove(1)
    assertEquals(0, map.size())
    assertNull(map.get(1))

    map.remove(1)
    assertEquals(0, map.size())
    assertNull(map.get(1))
  }
}
