Skip to content

Commit

Permalink
fix(config): improve getBoolean() and getNumber()
Browse files Browse the repository at this point in the history
  • Loading branch information
adamdbradley committed Mar 13, 2016
1 parent 085088e commit d44f8f6
Show file tree
Hide file tree
Showing 2 changed files with 114 additions and 11 deletions.
51 changes: 40 additions & 11 deletions ionic/config/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,9 @@ export class Config {
* Returns a single config value, given a key.
*
* @param {string} [key] - the key for the config value
* @param {any} [fallbackValue] - a fallback value to use when the config value was not found, or is config value is `null`. Fallback value defaults to `null`.
* @param {any} [fallbackValue] - a fallback value to use when the config
* value was not found, or is config value is `null`. Fallback value
* defaults to `null`.
*/
get(key: string, fallbackValue: any = null): any {

Expand Down Expand Up @@ -232,13 +234,42 @@ export class Config {
/**
* @name getBoolean
* @description
* Same as `get()`, however always returns a boolean value.
*
* Same as `get()`, however always returns a boolean value. If the
* value from `get()` is `null`, then it'll return the `fallbackValue`
* which defaults to `false`. Otherwise, `getBoolean()` will return
* if the config value is truthy or not. It also returns `true` if
* the config value was the string value `"true"`.
* @param {string} [key] - the key for the config value
* @param {boolean} [fallbackValue] - a fallback value to use when the config
* value was `null`. Fallback value defaults to `false`.
*/
getBoolean(key: string): boolean {
getBoolean(key: string, fallbackValue: boolean = false): boolean {
let val = this.get(key);
return (val || val === 'true') ? true : false;
if (val === null) {
return fallbackValue;
}
if (typeof val === 'string') {
return val === 'true';
}
return !!val;
}


/**
* @name getNumber
* @description
* Same as `get()`, however always returns a number value. Uses `parseFloat()`
* on the value received from `get()`. If the result from the parse is `NaN`,
* then it will return the value passed to `fallbackValue`. If no fallback
* value was provided then it'll default to returning `NaN` when the result
* is not a valid number.
* @param {string} [key] - the key for the config value
* @param {number} [fallbackValue] - a fallback value to use when the config
* value turned out to be `NaN`. Fallback value defaults to `NaN`.
*/
getNumber(key: string, fallbackValue: number = NaN): number {
let val = parseFloat( this.get(key) );
return isNaN(val) ? fallbackValue : val;
}


Expand Down Expand Up @@ -284,24 +315,22 @@ export class Config {
* @name settings()
* @description
*/
settings() {
const args = arguments;

switch (args.length) {
settings(arg0?: any, arg1?: any) {
switch (arguments.length) {

case 0:
return this._s;

case 1:
// settings({...})
this._s = args[0];
this._s = arg0;
this._c = {}; // clear cache
break;

case 2:
// settings('ios', {...})
this._s.platforms = this._s.platforms || {};
this._s.platforms[args[0]] = args[1];
this._s.platforms[arg0] = arg1;
this._c = {}; // clear cache
break;
}
Expand Down
74 changes: 74 additions & 0 deletions ionic/config/test/config.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,80 @@ export function run() {
expect(config.get('occupation', 'Weather Man')).toEqual('Weather Man');
});

it('should get a boolean value with a boolean config value', () => {
let config = new Config({
key1: true,
key2: false
});
expect(config.getBoolean('key1')).toEqual(true);
expect(config.getBoolean('key2')).toEqual(false);
});

it('should get a boolean value with a string config value', () => {
let config = new Config({
key1: 'true',
key2: 'false',
key3: 'whatever'
});
expect(config.getBoolean('key1')).toEqual(true);
expect(config.getBoolean('key2')).toEqual(false);
expect(config.getBoolean('key3')).toEqual(false);
expect(config.getBoolean('key4')).toEqual(false);
expect(config.getBoolean('key5', true)).toEqual(true);
});

it('should get a boolean value with a number config value', () => {
let config = new Config({
key1: 0,
key2: 1,
key3: 'whatever'
});
expect(config.getBoolean('key1')).toEqual(false);
expect(config.getBoolean('key2')).toEqual(true);
});

it('should get a number value with a number config value', () => {
let config = new Config({
key: 6
});
expect(config.getNumber('key')).toEqual(6);
});

it('should get a number value with a string config value', () => {
let config = new Config({
key: '6',
numThenString: '6baymax',
stringThenNum: 'baymax6'
});
expect(config.getNumber('key', 5)).toEqual(6);
expect(config.getNumber('numThenString', 4)).toEqual(6);
expect( isNaN(config.getNumber('stringThenNum')) ).toEqual(true);
});

it('should get a number NaN value with a NaN config value', () => {
let config = new Config({
allString: 'allstring',
imNull: null,
imUndefined: undefined
});
expect( isNaN(config.getNumber('notfound'))).toEqual(true);
expect( isNaN(config.getNumber('allString'))).toEqual(true);
expect( isNaN(config.getNumber('imNull'))).toEqual(true);
expect( isNaN(config.getNumber('imUndefined'))).toEqual(true);
});

it('should get a number fallback value with a NaN config value', () => {
let config = new Config({
allString: 'allstring',
imNull: null,
imUndefined: undefined
});
expect( config.getNumber('notfound', 6)).toEqual(6);
expect( config.getNumber('allString', 6)).toEqual(6);
expect( config.getNumber('imNull', 6)).toEqual(6);
expect( config.getNumber('imUndefined', 6)).toEqual(6);
});

it('should get settings object', () => {
let config = new Config({
name: 'Doc Brown',
Expand Down

0 comments on commit d44f8f6

Please sign in to comment.