<?php
namespace apache\shindig\test\social;
use apache\shindig\social\converters\InputPeopleConverter;

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

/**
 * InputAtomConverter test case.
 */
class InputPeopleConverterTest extends \PHPUnit_Framework_TestCase {

  /**
   * @var InputPeopleConverter
   */
  private $inputConverter;

  /**
   * Prepares the environment before running a test.
   */
  protected function setUp() {
    parent::setUp();
    $this->inputConverter = new InputPeopleConverter();
  }

  /**
   * Cleans up the environment after running a test.
   */
  protected function tearDown() {
    $this->inputConverter = null;
    parent::tearDown();
  }

  public function testConvertAtom() {
    $this->setExpectedException('Exception');
    $this->inputConverter->convertAtom('');
  }

  public function testConvertJson() {
    $this->setExpectedException('Exception');
    $this->inputConverter->convertJson();
  }

  public function testConvertXml() {
    $this->setExpectedException('Exception');
    $this->inputConverter->convertXml('');
  }
}
