<!DOCTYPE html>
<html>
<!--
Copyright (c) 2012 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<head>
<title>Settings tests</title>
<script src="base.js"></script>
</head>
<body>
<script>
'use strict';

base.require('unittest');
base.require('test_utils');
base.require('settings');

function testSetGetString() {
  var settings = new base.Settings();
  settings.set('my_key', 'my_val');
  assertEquals('my_val', settings.get('my_key'));
}

function testSetGetNumber() {
  var settings = new base.Settings();
  settings.set('my_key', 5);
  // Numbers are converted to strings.
  assertEquals('5', settings.get('my_key'));
}

function testSetGetBool() {
  var settings = new base.Settings();
  settings.set('my_key', false);
  // Booleans are converted to strings.
  assertEquals('false', settings.get('my_key'));
}

function testSetGetObject() {
  var settings = new base.Settings();
  settings.set('my_key', {'hello': 5});
  // Objects are converted to strings.
  assertEquals('[object Object]', settings.get('my_key'));
}

function testGetUnset() {
  var settings = new base.Settings();
  // Undefined should be returned if value isn't set.
  assertUndefined(settings.get('my_key'));
}

function testGetDefault() {
  var settings = new base.Settings();
  // Null should be returned if value isn't set.
  assertEquals('default_val', settings.get('my_key', 'default_val'));
}

function testSetGetPrefix() {
  var settings = new base.Settings();
  settings.set('key_a', 'foo', 'my_prefix');
  assertEquals('foo', settings.get('key_a', undefined, 'my_prefix'));
  assertEquals('foo', settings.get('key_a', 'bar', 'my_prefix'));
  assertEquals(undefined, settings.get('key_a'));
  assertEquals('bar', settings.get('key_a', 'bar'));
}

function testKeys() {
  var settings = new base.Settings();
  settings.set('key_a', 'foo');
  settings.set('key_b', 'bar');
  settings.set('key_c', 'baz');
  assertArrayEquals(['key_a', 'key_b', 'key_c'], settings.keys());
}

function testKeysPrefix() {
  var settings = new base.Settings();
  settings.set('key_a', 'foo', 'prefix1');
  settings.set('key_b', 'bar', 'prefix1');
  settings.set('key_c', 'baz', 'prefix1');
  settings.set('key_a', 'foo', 'prefix2');
  settings.set('key_b', 'bar', 'prefix2');
  settings.set('key_C', 'baz', 'prefix2');
  assertArrayEquals(['key_a', 'key_b', 'key_c'], settings.keys('prefix1'));
  assertArrayEquals(['key_C', 'key_a', 'key_b'], settings.keys('prefix2'));
  assertArrayEquals(['prefix1.key_a', 'prefix1.key_b', 'prefix1.key_c',
                     'prefix2.key_C', 'prefix2.key_a', 'prefix2.key_b'],
                    settings.keys());
}

</script>
</body>
</html>
