1use Test::More tests => 36;
2
3use lib '../lib';
4use Test::Deep;
5use Config::JSON;
6use File::Temp qw/ tempfile /;
7
8my ($fh, $filename) = tempfile();
9close($fh);
10my $config = Config::JSON->create($filename);
11ok (defined $config, "create new config");
12
13# set up test data
14if (open(my $file, ">", $filename)) {
15my $testData = <<END;
16# config-file-type: JSON 1
17
18 {
19        "dsn" : "DBI:mysql:test",
20        "user" : "tester",
21        "password" : "xxxxxx",
22
23        # some colors to choose from
24        "colors" : [ "red", "green", "blue" ],
25
26        # some statistics
27        "stats" : {
28                "health" : 32,
29                "vitality" : 11
30        },
31
32        # multilevel
33        "this" : {
34            "that" : {
35                "scalar" : "foo",
36                "array" : ["foo", "bar"],
37                "hash" : {
38                    "foo" : 1,
39                    "bar" : 2
40                }
41            }
42        }
43 }
44
45END
46	print {$file} $testData;
47	close($file);
48	ok(1, "set up test data");
49}
50else {
51	ok(0, "set up test data");
52}
53
54$config = Config::JSON->new($filename);
55isa_ok($config, "Config::JSON" );
56
57# getFilePath and getFilename
58is( $config->getFilePath, $filename, "getFilePath()" );
59my $justTheName = $filename;
60$justTheName =~ s{.*/(\w+)$}{$1}xmsg;
61is( $config->getFilename, $justTheName, "getFilename()" );
62
63# get
64ok( $config->get("dsn") ne "", "get()" );
65is( ref $config->get("stats"), "HASH", "get() hash" );
66is( ref $config->get("colors"), "ARRAY", "get() array" );
67is( $config->get("this/that/scalar"), "foo", "get() multilevel");
68is( ref $config->get("this/that/hash"), "HASH", "get() hash multilevel" );
69is( ref $config->get("this/that/array"), "ARRAY", "get() array multilevel" );
70eval{$config->get("this/that/array/non-existant-element")};
71ok($@, "Throw an error when trying to access an element of an array.");
72
73# set
74$config->set('privateArray', ['a', 'b', 'c']);
75cmp_bag($config->get('privateArray'), ['a', 'b', 'c'], 'set()');
76$config->set('cars/ford', "mustang");
77is($config->get('cars/ford'), "mustang", 'set() multilevel non-exisistant');
78$config->set('cars/ford', [qw( mustang pinto maverick )]);
79cmp_bag($config->get('cars/ford'),[qw( mustang pinto maverick )], 'set() multilevel');
80$config->addToHash('hash','cdn\\/','CDNRoot');
81my $hash = $config->get('hash');
82is $hash->{'cdn/'}, 'CDNRoot', 'allow for escaped slashes in keys';
83my $reconfig = Config::JSON->new($filename);
84cmp_bag($config->get('cars/ford'),$reconfig->get('cars/ford'), 'set() multilevel after re-reading config file');
85$config->set('Data::GUID', '9EDE9D96-D416-11DF-A7FC-B391564030AF');
86is($config->get('Data::GUID'), '9EDE9D96-D416-11DF-A7FC-B391564030AF', 'report that Data::GUID does not work with CJ');
87
88# delete
89$config->delete("dsn");
90ok(!(defined $config->get("dsn")), "delete()");
91$config->delete("stats/vitality");
92ok(!(defined $config->get("stats/vitality")), "delete() multilevel");
93ok(defined $config->get("stats"), "delete() multilevel - doesn't delete parent");
94$config->delete('this/that/hash');
95ok(defined $config->get('this/that/scalar'), "delete() multilevel - doesn't delete siblings");
96
97# addToArray
98$config->addToArray("colors","TEST");
99ok((grep /TEST/, @{$config->get("colors")}), "addToArray()");
100$config->addToArray("cars/ford", "fairlane");
101ok((grep /fairlane/, @{$config->get("cars/ford")}), "addToArray() multilevel");
102
103# deleteFromArray
104$config->deleteFromArray("colors","TEST");
105ok(!(grep /TEST/, @{$config->get("colors")}), "deleteFromArray()");
106$config->deleteFromArray("cars/ford", "fairlane");
107ok(!(grep /fairlane/, @{$config->get("cars/ford")}), "deleteFromArray() multilevel");
108
109# addToArrayBefore
110$config->addToArrayBefore("colors","green",'orange');
111is_deeply($config->get('colors'), [qw(red orange green blue)], "addToArrayBefore works");
112$config->addToArrayBefore("colors","green",'orange');
113is_deeply($config->get('colors'), [qw(red orange green blue)], "addToArrayBefore doesn't insert duplicate entries");
114$config->addToArrayBefore('colors', 'purple', 'black');
115is_deeply($config->get('colors'), [qw(black red orange green blue)], "addToArrayBefore with item that doesn't exist adds to beginning of array");
116$config->set('colors', [qw(red green blue)]);
117
118# addToArrayAfter
119$config->addToArrayAfter('colors', 'green', 'orange');
120is_deeply($config->get('colors'), [qw(red green orange blue)], "addToArrayAfter works");
121$config->addToArrayAfter('colors', 'green', 'orange');
122is_deeply($config->get('colors'), [qw(red green orange blue)], "addToArrayAfter doesn't insert duplicate entries");
123$config->addToArrayAfter('colors', 'purple', 'black');
124is_deeply($config->get('colors'), [qw(red green orange blue black)], "addToArrayAfter with item that doesn't exist adds to end of array");
125$config->set('colors', [qw(red green blue)]);
126
127# addToHash
128$config->addToHash("stats","TEST","VALUE");
129is($config->get("stats/TEST"), "VALUE", "addToHash()");
130$config->addToHash("this/that/hash", "three", 3);
131is($config->get("this/that/hash/three"), 3, "addToHash() multilevel");
132
133# deleteFromHash
134$config->deleteFromHash("stats","TEST");
135$hash = $config->get("stats");
136ok(!(exists $hash->{TEST}), "deleteFromHash()");
137$config->deleteFromHash("this/that/hash", "three");
138$hash = $config->get("this/that/hash");
139ok(!(exists $hash->{three}), "deleteFromHash() multilevel");
140
141
142