mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 08:54:53 +00:00
* stdlib tests now check refc too * typo * fixes line numbers * disable cpp * do not touch
133 lines
4.4 KiB
Nim
133 lines
4.4 KiB
Nim
discard """
|
|
matrix: "--mm:refc; --mm:orc"
|
|
targets: "c js"
|
|
"""
|
|
|
|
import parsecfg, streams, sequtils
|
|
import std/assertions
|
|
|
|
when not defined(js):
|
|
from stdtest/specialpaths import buildDir
|
|
import os
|
|
# bug #6046
|
|
block:
|
|
var config = newConfig()
|
|
config.setSectionKey("foo", "bar", "-1")
|
|
config.setSectionKey("foo", "foo", "abc")
|
|
|
|
const file = buildDir / "tparsecfg.ini"
|
|
config.writeConfig(file)
|
|
|
|
# file now contains
|
|
# [foo]
|
|
# bar=-1
|
|
# foo=abc
|
|
|
|
var config2 = loadConfig(file)
|
|
let bar = config2.getSectionValue("foo", "bar")
|
|
let foo = config2.getSectionValue("foo", "foo")
|
|
doAssert(bar == "-1")
|
|
doAssert(foo == "abc")
|
|
|
|
## Creating a configuration file.
|
|
var dict1 = newConfig()
|
|
dict1.setSectionKey("", "charset", "utf-8")
|
|
dict1.setSectionKey("Package", "name", "hello")
|
|
dict1.setSectionKey("Package", "--threads", "on")
|
|
dict1.setSectionKey("Author", "name", "lihf8515")
|
|
dict1.setSectionKey("Author", "qq", "10214028")
|
|
dict1.setSectionKey("Author", "email", "lihaifeng@wxm.com")
|
|
var ss = newStringStream()
|
|
dict1.writeConfig(ss)
|
|
|
|
## Reading a configuration file.
|
|
let dict2 = loadConfig(newStringStream(ss.data))
|
|
doAssert dict2.getSectionValue("", "charset") == "utf-8"
|
|
doAssert dict2.getSectionValue("Package", "--threads") == "on"
|
|
doAssert dict2.getSectionValue("Package", "name") == "hello"
|
|
doAssert dict2.getSectionValue("Author", "name") == "lihf8515"
|
|
doAssert dict2.getSectionValue("Author", "qq") == "10214028"
|
|
doAssert dict2.getSectionValue("Author", "email") == "lihaifeng@wxm.com"
|
|
doAssert toSeq(dict2.sections) == @["", "Package", "Author"]
|
|
|
|
## Modifying a configuration file.
|
|
var dict3 = loadConfig(newStringStream(ss.data))
|
|
dict3.setSectionKey("Author", "name", "lhf")
|
|
doAssert $dict3 == """charset=utf-8
|
|
[Package]
|
|
name=hello
|
|
--threads:on
|
|
[Author]
|
|
name=lhf
|
|
qq=10214028
|
|
email="lihaifeng@wxm.com"
|
|
"""
|
|
|
|
## Deleting a section key in a configuration file.
|
|
var dict4 = loadConfig(newStringStream(ss.data))
|
|
dict4.delSectionKey("Author", "email")
|
|
doAssert $dict4 == """charset=utf-8
|
|
[Package]
|
|
name=hello
|
|
--threads:on
|
|
[Author]
|
|
name=lihf8515
|
|
qq=10214028
|
|
"""
|
|
|
|
block:
|
|
var dict = loadConfig(newStringStream("""[Simple Values]
|
|
key=value
|
|
spaces in keys=allowed
|
|
spaces in values=allowed as well
|
|
spaces around the delimiter = obviously
|
|
you can also use : to delimit keys from values
|
|
[All Values Are Strings]
|
|
values like this: 19990429
|
|
or this: 3.14159265359
|
|
are they treated as numbers : no
|
|
integers floats and booleans are held as: strings
|
|
can use the API to get converted values directly: true
|
|
[No Values]
|
|
key_without_value
|
|
# empty string value is not allowed =
|
|
[ Seletion A ]
|
|
space around section name will be ignored
|
|
[You can use comments]
|
|
# like this
|
|
; or this
|
|
# By default only in an empty line.
|
|
# Inline comments can be harmful because they prevent users
|
|
# from using the delimiting characters as parts of values.
|
|
# That being said, this can be customized.
|
|
[Sections Can Be Indented]
|
|
can_values_be_as_well = True
|
|
does_that_mean_anything_special = False
|
|
purpose = formatting for readability
|
|
# Did I mention we can indent comments, too?
|
|
""")
|
|
)
|
|
|
|
let section1 = "Simple Values"
|
|
doAssert dict.getSectionValue(section1, "key") == "value"
|
|
doAssert dict.getSectionValue(section1, "spaces in keys") == "allowed"
|
|
doAssert dict.getSectionValue(section1, "spaces in values") == "allowed as well"
|
|
doAssert dict.getSectionValue(section1, "spaces around the delimiter") == "obviously"
|
|
doAssert dict.getSectionValue(section1, "you can also use") == "to delimit keys from values"
|
|
|
|
let section2 = "All Values Are Strings"
|
|
doAssert dict.getSectionValue(section2, "values like this") == "19990429"
|
|
doAssert dict.getSectionValue(section2, "or this") == "3.14159265359"
|
|
doAssert dict.getSectionValue(section2, "are they treated as numbers") == "no"
|
|
doAssert dict.getSectionValue(section2, "integers floats and booleans are held as") == "strings"
|
|
doAssert dict.getSectionValue(section2, "can use the API to get converted values directly") == "true"
|
|
|
|
let section3 = "Seletion A"
|
|
doAssert dict.getSectionValue(section3,
|
|
"space around section name will be ignored", "not an empty value") == ""
|
|
|
|
let section4 = "Sections Can Be Indented"
|
|
doAssert dict.getSectionValue(section4, "can_values_be_as_well") == "True"
|
|
doAssert dict.getSectionValue(section4, "does_that_mean_anything_special") == "False"
|
|
doAssert dict.getSectionValue(section4, "purpose") == "formatting for readability"
|