1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-01-31 00:42:50 -05:00

core: ensure all NM tests use mock backend + re-orgs + dep updates

This commit is contained in:
bbedward
2025-11-13 21:44:03 -05:00
parent b2879878a1
commit 6465b11e9b
21 changed files with 516 additions and 434 deletions

42
core/.mockery.yml Normal file
View File

@@ -0,0 +1,42 @@
with-expecter: true
dir: "internal/mocks/{{.InterfaceDirRelative}}"
mockname: "Mock{{.InterfaceName}}"
outpkg: "{{.PackageName}}"
packages:
github.com/Wifx/gonetworkmanager/v2:
interfaces:
NetworkManager:
Device:
DeviceWireless:
AccessPoint:
Connection:
Settings:
ActiveConnection:
IP4Config:
net:
interfaces:
Conn:
github.com/AvengeMedia/danklinux/internal/plugins:
interfaces:
GitClient:
github.com/godbus/dbus/v5:
interfaces:
BusObject:
github.com/AvengeMedia/danklinux/internal/server/brightness:
config:
dir: "internal/mocks/brightness"
outpkg: mocks_brightness
interfaces:
DBusConn:
github.com/AvengeMedia/danklinux/internal/server/network:
config:
dir: "internal/mocks/network"
outpkg: mocks_network
interfaces:
Backend:
github.com/AvengeMedia/danklinux/internal/server/cups:
config:
dir: "internal/mocks/cups"
outpkg: mocks_cups
interfaces:
CUPSClientInterface:

View File

@@ -4,7 +4,7 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/AvengeMedia/DankMaterialShell/core/internal/logger" "github.com/AvengeMedia/DankMaterialShell/core/internal/log"
"github.com/AvengeMedia/DankMaterialShell/core/internal/tui" "github.com/AvengeMedia/DankMaterialShell/core/internal/tui"
tea "github.com/charmbracelet/bubbletea" tea "github.com/charmbracelet/bubbletea"
) )
@@ -12,7 +12,7 @@ import (
var Version = "dev" var Version = "dev"
func main() { func main() {
fileLogger, err := logger.NewFileLogger() fileLogger, err := log.NewFileLogger()
if err != nil { if err != nil {
fmt.Printf("Warning: Failed to create log file: %v\n", err) fmt.Printf("Warning: Failed to create log file: %v\n", err)
fmt.Println("Continuing without file logging...") fmt.Println("Continuing without file logging...")

View File

@@ -5,61 +5,64 @@ go 1.24.6
require ( require (
github.com/Wifx/gonetworkmanager/v2 v2.2.0 github.com/Wifx/gonetworkmanager/v2 v2.2.0
github.com/charmbracelet/bubbles v0.21.0 github.com/charmbracelet/bubbles v0.21.0
github.com/charmbracelet/bubbletea v1.3.6 github.com/charmbracelet/bubbletea v1.3.10
github.com/charmbracelet/lipgloss v1.1.0 github.com/charmbracelet/lipgloss v1.1.0
github.com/charmbracelet/log v0.4.2 github.com/charmbracelet/log v0.4.2
github.com/godbus/dbus/v5 v5.1.0 github.com/godbus/dbus/v5 v5.1.0
github.com/spf13/cobra v1.9.1 github.com/spf13/cobra v1.10.1
github.com/stretchr/testify v1.11.1 github.com/stretchr/testify v1.11.1
github.com/yaslama/go-wayland/wayland v0.0.0-20250907155644-2874f32d9c34 github.com/yaslama/go-wayland/wayland v0.0.0-20250907155644-2874f32d9c34
golang.org/x/exp v0.0.0-20231006140011-7918f672742d golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6
) )
require ( require (
github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/ProtonMail/go-crypto v1.3.0 // indirect github.com/ProtonMail/go-crypto v1.3.0 // indirect
github.com/clipperhouse/displaywidth v0.5.0 // indirect
github.com/clipperhouse/stringish v0.1.1 // indirect
github.com/clipperhouse/uax29/v2 v2.3.0 // indirect
github.com/cloudflare/circl v1.6.1 // indirect github.com/cloudflare/circl v1.6.1 // indirect
github.com/cyphar/filepath-securejoin v0.4.1 // indirect github.com/cyphar/filepath-securejoin v0.6.0 // indirect
github.com/emirpasic/gods v1.18.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect
github.com/go-git/gcfg/v2 v2.0.2 // indirect github.com/go-git/gcfg/v2 v2.0.2 // indirect
github.com/go-git/go-billy/v6 v6.0.0-20250627091229-31e2a16eef30 // indirect github.com/go-git/go-billy/v6 v6.0.0-20251111123000-fb5ff8f3f0b0 // indirect
github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logfmt/logfmt v0.6.1 // indirect
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
github.com/kevinburke/ssh_config v1.4.0 // indirect github.com/kevinburke/ssh_config v1.4.0 // indirect
github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/pjbgf/sha1cd v0.5.0 // indirect github.com/pjbgf/sha1cd v0.5.0 // indirect
github.com/sergi/go-diff v1.4.0 // indirect github.com/sergi/go-diff v1.4.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect github.com/stretchr/objx v0.5.3 // indirect
golang.org/x/crypto v0.42.0 // indirect golang.org/x/crypto v0.44.0 // indirect
golang.org/x/net v0.44.0 // indirect golang.org/x/net v0.47.0 // indirect
) )
require ( require (
github.com/atotto/clipboard v0.1.4 // indirect github.com/atotto/clipboard v0.1.4 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect github.com/charmbracelet/colorprofile v0.3.3 // indirect
github.com/charmbracelet/harmonica v0.2.0 // indirect github.com/charmbracelet/harmonica v0.2.0 // indirect
github.com/charmbracelet/x/ansi v0.9.3 // indirect github.com/charmbracelet/x/ansi v0.11.0 // indirect
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect github.com/charmbracelet/x/cellbuf v0.0.14 // indirect
github.com/charmbracelet/x/term v0.2.1 // indirect github.com/charmbracelet/x/term v0.2.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
github.com/go-git/go-git/v6 v6.0.0-20250929195514-145daf2492dd github.com/go-git/go-git/v6 v6.0.0-20251112161705-8cc3e21f07a9
github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/lucasb-eyer/go-colorful v1.3.0 github.com/lucasb-eyer/go-colorful v1.3.0
github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-localereader v0.0.1 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mattn/go-runewidth v0.0.19 // indirect
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/cancelreader v0.2.2 // indirect
github.com/muesli/termenv v0.16.0 // indirect github.com/muesli/termenv v0.16.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect github.com/rivo/uniseg v0.4.7 // indirect
github.com/spf13/afero v1.15.0 github.com/spf13/afero v1.15.0
github.com/spf13/pflag v1.0.6 // indirect github.com/spf13/pflag v1.0.10 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
golang.org/x/sync v0.17.0 // indirect golang.org/x/sync v0.18.0 // indirect
golang.org/x/sys v0.36.0 golang.org/x/sys v0.38.0
golang.org/x/text v0.29.0 // indirect golang.org/x/text v0.31.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
) )

View File

@@ -16,8 +16,12 @@ github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u
github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg= github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg=
github.com/charmbracelet/bubbletea v1.3.6 h1:VkHIxPJQeDt0aFJIsVxw8BQdh/F/L2KKZGsK6et5taU= github.com/charmbracelet/bubbletea v1.3.6 h1:VkHIxPJQeDt0aFJIsVxw8BQdh/F/L2KKZGsK6et5taU=
github.com/charmbracelet/bubbletea v1.3.6/go.mod h1:oQD9VCRQFF8KplacJLo28/jofOI2ToOfGYeFgBBxHOc= github.com/charmbracelet/bubbletea v1.3.6/go.mod h1:oQD9VCRQFF8KplacJLo28/jofOI2ToOfGYeFgBBxHOc=
github.com/charmbracelet/bubbletea v1.3.10 h1:otUDHWMMzQSB0Pkc87rm691KZ3SWa4KUlvF9nRvCICw=
github.com/charmbracelet/bubbletea v1.3.10/go.mod h1:ORQfo0fk8U+po9VaNvnV95UPWA1BitP1E0N6xJPlHr4=
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk=
github.com/charmbracelet/colorprofile v0.3.3 h1:DjJzJtLP6/NZ8p7Cgjno0CKGr7wwRJGxWUwh2IyhfAI=
github.com/charmbracelet/colorprofile v0.3.3/go.mod h1:nB1FugsAbzq284eJcjfah2nhdSLppN2NqvfotkfRYP4=
github.com/charmbracelet/harmonica v0.2.0 h1:8NxJWRWg/bzKqqEaaeFNipOu77YR5t8aSwG4pgaUBiQ= github.com/charmbracelet/harmonica v0.2.0 h1:8NxJWRWg/bzKqqEaaeFNipOu77YR5t8aSwG4pgaUBiQ=
github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao=
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
@@ -26,15 +30,29 @@ github.com/charmbracelet/log v0.4.2 h1:hYt8Qj6a8yLnvR+h7MwsJv/XvmBJXiueUcI3cIxsy
github.com/charmbracelet/log v0.4.2/go.mod h1:qifHGX/tc7eluv2R6pWIpyHDDrrb/AG71Pf2ysQu5nw= github.com/charmbracelet/log v0.4.2/go.mod h1:qifHGX/tc7eluv2R6pWIpyHDDrrb/AG71Pf2ysQu5nw=
github.com/charmbracelet/x/ansi v0.9.3 h1:BXt5DHS/MKF+LjuK4huWrC6NCvHtexww7dMayh6GXd0= github.com/charmbracelet/x/ansi v0.9.3 h1:BXt5DHS/MKF+LjuK4huWrC6NCvHtexww7dMayh6GXd0=
github.com/charmbracelet/x/ansi v0.9.3/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE= github.com/charmbracelet/x/ansi v0.9.3/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE=
github.com/charmbracelet/x/ansi v0.11.0 h1:uuIVK7GIplwX6UBIz8S2TF8nkr7xRlygSsBRjSJqIvA=
github.com/charmbracelet/x/ansi v0.11.0/go.mod h1:uQt8bOrq/xgXjlGcFMc8U2WYbnxyjrKhnvTQluvfCaE=
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8= github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8=
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
github.com/charmbracelet/x/cellbuf v0.0.14 h1:iUEMryGyFTelKW3THW4+FfPgi4fkmKnnaLOXuc+/Kj4=
github.com/charmbracelet/x/cellbuf v0.0.14/go.mod h1:P447lJl49ywBbil/KjCk2HexGh4tEY9LH0/1QrZZ9rA=
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk=
github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI=
github.com/clipperhouse/displaywidth v0.5.0 h1:AIG5vQaSL2EKqzt0M9JMnvNxOCRTKUc4vUnLWGgP89I=
github.com/clipperhouse/displaywidth v0.5.0/go.mod h1:R+kHuzaYWFkTm7xoMmK1lFydbci4X2CicfbGstSGg0o=
github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs=
github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA=
github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4=
github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g=
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s=
github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=
github.com/cyphar/filepath-securejoin v0.6.0 h1:BtGB77njd6SVO6VztOHfPxKitJvd/VPT+OFBFMOi1Is=
github.com/cyphar/filepath-securejoin v0.6.0/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -50,12 +68,18 @@ github.com/go-git/gcfg/v2 v2.0.2 h1:MY5SIIfTGGEMhdA7d7JePuVVxtKL7Hp+ApGDJAJ7dpo=
github.com/go-git/gcfg/v2 v2.0.2/go.mod h1:/lv2NsxvhepuMrldsFilrgct6pxzpGdSRC13ydTLSLs= github.com/go-git/gcfg/v2 v2.0.2/go.mod h1:/lv2NsxvhepuMrldsFilrgct6pxzpGdSRC13ydTLSLs=
github.com/go-git/go-billy/v6 v6.0.0-20250627091229-31e2a16eef30 h1:4KqVJTL5eanN8Sgg3BV6f2/QzfZEFbCd+rTak1fGRRA= github.com/go-git/go-billy/v6 v6.0.0-20250627091229-31e2a16eef30 h1:4KqVJTL5eanN8Sgg3BV6f2/QzfZEFbCd+rTak1fGRRA=
github.com/go-git/go-billy/v6 v6.0.0-20250627091229-31e2a16eef30/go.mod h1:snwvGrbywVFy2d6KJdQ132zapq4aLyzLMgpo79XdEfM= github.com/go-git/go-billy/v6 v6.0.0-20250627091229-31e2a16eef30/go.mod h1:snwvGrbywVFy2d6KJdQ132zapq4aLyzLMgpo79XdEfM=
github.com/go-git/go-billy/v6 v6.0.0-20251111123000-fb5ff8f3f0b0 h1:EC9n6hr6yKDoVJ6g7Ko523LbbceJfR0ohbOp809Fyf4=
github.com/go-git/go-billy/v6 v6.0.0-20251111123000-fb5ff8f3f0b0/go.mod h1:E3VhlS+AKkrq6ZNn1axE2/nDRJ87l1FJk9r5HT2vPX0=
github.com/go-git/go-git-fixtures/v5 v5.1.1 h1:OH8i1ojV9bWfr0ZfasfpgtUXQHQyVS8HXik/V1C099w= github.com/go-git/go-git-fixtures/v5 v5.1.1 h1:OH8i1ojV9bWfr0ZfasfpgtUXQHQyVS8HXik/V1C099w=
github.com/go-git/go-git-fixtures/v5 v5.1.1/go.mod h1:Altk43lx3b1ks+dVoAG2300o5WWUnktvfY3VI6bcaXU= github.com/go-git/go-git-fixtures/v5 v5.1.1/go.mod h1:Altk43lx3b1ks+dVoAG2300o5WWUnktvfY3VI6bcaXU=
github.com/go-git/go-git/v6 v6.0.0-20250929195514-145daf2492dd h1:30HEd5KKVM7GgMJ1GSNuYxuZXEg8Pdlngp6T51faxoc= github.com/go-git/go-git/v6 v6.0.0-20250929195514-145daf2492dd h1:30HEd5KKVM7GgMJ1GSNuYxuZXEg8Pdlngp6T51faxoc=
github.com/go-git/go-git/v6 v6.0.0-20250929195514-145daf2492dd/go.mod h1:lz8PQr/p79XpFq5ODVBwRJu5LnOF8Et7j95ehqmCMJU= github.com/go-git/go-git/v6 v6.0.0-20250929195514-145daf2492dd/go.mod h1:lz8PQr/p79XpFq5ODVBwRJu5LnOF8Et7j95ehqmCMJU=
github.com/go-git/go-git/v6 v6.0.0-20251112161705-8cc3e21f07a9 h1:SOFrnF9LCssC6q6Rb0084Bzg2aBYbe8QXv9xKGXmt/w=
github.com/go-git/go-git/v6 v6.0.0-20251112161705-8cc3e21f07a9/go.mod h1:0wtvm/JfPC9RFVEAP3ks0ec5h64/qmZkTTUE3pjz7Hc=
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-logfmt/logfmt v0.6.1 h1:4hvbpePJKnIzH1B+8OR/JPbTx37NktoI9LE2QZBBkvE=
github.com/go-logfmt/logfmt v0.6.1/go.mod h1:EV2pOAQoZaT1ZXZbqDl5hrymndi4SY9ED9/z6CO0XAk=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
@@ -81,6 +105,8 @@ github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2J
github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88=
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw=
github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
@@ -103,11 +129,18 @@ github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/objx v0.5.3 h1:jmXUvGomnU1o3W/V5h2VEradbpJDwGrzugQQvL0POH4=
github.com/stretchr/objx v0.5.3/go.mod h1:rDQraq+vQZU7Fde9LOZLr8Tax6zZvy4kuNKF+QYS+U0=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
@@ -117,20 +150,33 @@ github.com/yaslama/go-wayland/wayland v0.0.0-20250907155644-2874f32d9c34 h1:iTAt
github.com/yaslama/go-wayland/wayland v0.0.0-20250907155644-2874f32d9c34/go.mod h1:jzmUN5lUAv2O8e63OvcauV4S30rIZ1BvF/PNYE37vDo= github.com/yaslama/go-wayland/wayland v0.0.0-20250907155644-2874f32d9c34/go.mod h1:jzmUN5lUAv2O8e63OvcauV4S30rIZ1BvF/PNYE37vDo=
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU=
golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc=
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 h1:zfMcR1Cs4KNuomFFgGefv5N0czO2XZpUbxGUy8i8ug0=
golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0=
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ=
golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA=
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=

View File

@@ -4,7 +4,6 @@ import (
"fmt" "fmt"
"strings" "strings"
"github.com/AvengeMedia/DankMaterialShell/core/internal/hyprland"
"github.com/AvengeMedia/DankMaterialShell/core/internal/keybinds" "github.com/AvengeMedia/DankMaterialShell/core/internal/keybinds"
) )
@@ -26,7 +25,7 @@ func (h *HyprlandProvider) Name() string {
} }
func (h *HyprlandProvider) GetCheatSheet() (*keybinds.CheatSheet, error) { func (h *HyprlandProvider) GetCheatSheet() (*keybinds.CheatSheet, error) {
section, err := hyprland.ParseKeys(h.configPath) section, err := ParseHyprlandKeys(h.configPath)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to parse hyprland config: %w", err) return nil, fmt.Errorf("failed to parse hyprland config: %w", err)
} }
@@ -41,7 +40,7 @@ func (h *HyprlandProvider) GetCheatSheet() (*keybinds.CheatSheet, error) {
}, nil }, nil
} }
func (h *HyprlandProvider) convertSection(section *hyprland.Section, subcategory string, categorizedBinds map[string][]keybinds.Keybind) { func (h *HyprlandProvider) convertSection(section *HyprlandSection, subcategory string, categorizedBinds map[string][]keybinds.Keybind) {
currentSubcat := subcategory currentSubcat := subcategory
if section.Name != "" { if section.Name != "" {
currentSubcat = section.Name currentSubcat = section.Name
@@ -86,7 +85,7 @@ func (h *HyprlandProvider) categorizeByDispatcher(dispatcher string) string {
} }
} }
func (h *HyprlandProvider) convertKeybind(kb *hyprland.KeyBinding, subcategory string) keybinds.Keybind { func (h *HyprlandProvider) convertKeybind(kb *HyprlandKeyBinding, subcategory string) keybinds.Keybind {
key := h.formatKey(kb) key := h.formatKey(kb)
desc := kb.Comment desc := kb.Comment
@@ -108,7 +107,7 @@ func (h *HyprlandProvider) generateDescription(dispatcher, params string) string
return dispatcher return dispatcher
} }
func (h *HyprlandProvider) formatKey(kb *hyprland.KeyBinding) string { func (h *HyprlandProvider) formatKey(kb *HyprlandKeyBinding) string {
parts := make([]string, 0, len(kb.Mods)+1) parts := make([]string, 0, len(kb.Mods)+1)
parts = append(parts, kb.Mods...) parts = append(parts, kb.Mods...)
parts = append(parts, kb.Key) parts = append(parts, kb.Key)

View File

@@ -1,4 +1,4 @@
package hyprland package providers
import ( import (
"os" "os"
@@ -15,7 +15,7 @@ const (
var ModSeparators = []rune{'+', ' '} var ModSeparators = []rune{'+', ' '}
type KeyBinding struct { type HyprlandKeyBinding struct {
Mods []string `json:"mods"` Mods []string `json:"mods"`
Key string `json:"key"` Key string `json:"key"`
Dispatcher string `json:"dispatcher"` Dispatcher string `json:"dispatcher"`
@@ -23,25 +23,25 @@ type KeyBinding struct {
Comment string `json:"comment"` Comment string `json:"comment"`
} }
type Section struct { type HyprlandSection struct {
Children []Section `json:"children"` Children []HyprlandSection `json:"children"`
Keybinds []KeyBinding `json:"keybinds"` Keybinds []HyprlandKeyBinding `json:"keybinds"`
Name string `json:"name"` Name string `json:"name"`
} }
type Parser struct { type HyprlandParser struct {
contentLines []string contentLines []string
readingLine int readingLine int
} }
func NewParser() *Parser { func NewHyprlandParser() *HyprlandParser {
return &Parser{ return &HyprlandParser{
contentLines: []string{}, contentLines: []string{},
readingLine: 0, readingLine: 0,
} }
} }
func (p *Parser) ReadContent(directory string) error { func (p *HyprlandParser) ReadContent(directory string) error {
expandedDir := os.ExpandEnv(directory) expandedDir := os.ExpandEnv(directory)
expandedDir = filepath.Clean(expandedDir) expandedDir = filepath.Clean(expandedDir)
if strings.HasPrefix(expandedDir, "~") { if strings.HasPrefix(expandedDir, "~") {
@@ -87,7 +87,7 @@ func (p *Parser) ReadContent(directory string) error {
return nil return nil
} }
func autogenerateComment(dispatcher, params string) string { func hyprlandAutogenerateComment(dispatcher, params string) string {
switch dispatcher { switch dispatcher {
case "resizewindow": case "resizewindow":
return "Resize window" return "Resize window"
@@ -196,7 +196,7 @@ func autogenerateComment(dispatcher, params string) string {
} }
} }
func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding { func (p *HyprlandParser) getKeybindAtLine(lineNumber int) *HyprlandKeyBinding {
line := p.contentLines[lineNumber] line := p.contentLines[lineNumber]
parts := strings.SplitN(line, "=", 2) parts := strings.SplitN(line, "=", 2)
if len(parts) < 2 { if len(parts) < 2 {
@@ -232,7 +232,7 @@ func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding {
return nil return nil
} }
} else { } else {
comment = autogenerateComment(dispatcher, params) comment = hyprlandAutogenerateComment(dispatcher, params)
} }
var modList []string var modList []string
@@ -256,7 +256,7 @@ func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding {
} }
} }
return &KeyBinding{ return &HyprlandKeyBinding{
Mods: modList, Mods: modList,
Key: key, Key: key,
Dispatcher: dispatcher, Dispatcher: dispatcher,
@@ -265,7 +265,7 @@ func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding {
} }
} }
func (p *Parser) getBindsRecursive(currentContent *Section, scope int) *Section { func (p *HyprlandParser) getBindsRecursive(currentContent *HyprlandSection, scope int) *HyprlandSection {
titleRegex := regexp.MustCompile(TitleRegex) titleRegex := regexp.MustCompile(TitleRegex)
for p.readingLine < len(p.contentLines) { for p.readingLine < len(p.contentLines) {
@@ -283,9 +283,9 @@ func (p *Parser) getBindsRecursive(currentContent *Section, scope int) *Section
sectionName := strings.TrimSpace(line[headingScope+1:]) sectionName := strings.TrimSpace(line[headingScope+1:])
p.readingLine++ p.readingLine++
childSection := &Section{ childSection := &HyprlandSection{
Children: []Section{}, Children: []HyprlandSection{},
Keybinds: []KeyBinding{}, Keybinds: []HyprlandKeyBinding{},
Name: sectionName, Name: sectionName,
} }
result := p.getBindsRecursive(childSection, headingScope) result := p.getBindsRecursive(childSection, headingScope)
@@ -312,18 +312,18 @@ func (p *Parser) getBindsRecursive(currentContent *Section, scope int) *Section
return currentContent return currentContent
} }
func (p *Parser) ParseKeys() *Section { func (p *HyprlandParser) ParseKeys() *HyprlandSection {
p.readingLine = 0 p.readingLine = 0
rootSection := &Section{ rootSection := &HyprlandSection{
Children: []Section{}, Children: []HyprlandSection{},
Keybinds: []KeyBinding{}, Keybinds: []HyprlandKeyBinding{},
Name: "", Name: "",
} }
return p.getBindsRecursive(rootSection, 0) return p.getBindsRecursive(rootSection, 0)
} }
func ParseKeys(path string) (*Section, error) { func ParseHyprlandKeys(path string) (*HyprlandSection, error) {
parser := NewParser() parser := NewHyprlandParser()
if err := parser.ReadContent(path); err != nil { if err := parser.ReadContent(path); err != nil {
return nil, err return nil, err
} }

View File

@@ -1,4 +1,4 @@
package hyprland package providers
import ( import (
"os" "os"
@@ -6,7 +6,7 @@ import (
"testing" "testing"
) )
func TestAutogenerateComment(t *testing.T) { func TestHyprlandAutogenerateComment(t *testing.T) {
tests := []struct { tests := []struct {
dispatcher string dispatcher string
params string params string
@@ -51,25 +51,25 @@ func TestAutogenerateComment(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.dispatcher+"_"+tt.params, func(t *testing.T) { t.Run(tt.dispatcher+"_"+tt.params, func(t *testing.T) {
result := autogenerateComment(tt.dispatcher, tt.params) result := hyprlandAutogenerateComment(tt.dispatcher, tt.params)
if result != tt.expected { if result != tt.expected {
t.Errorf("autogenerateComment(%q, %q) = %q, want %q", t.Errorf("hyprlandAutogenerateComment(%q, %q) = %q, want %q",
tt.dispatcher, tt.params, result, tt.expected) tt.dispatcher, tt.params, result, tt.expected)
} }
}) })
} }
} }
func TestGetKeybindAtLine(t *testing.T) { func TestHyprlandGetKeybindAtLine(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
line string line string
expected *KeyBinding expected *HyprlandKeyBinding
}{ }{
{ {
name: "basic_keybind", name: "basic_keybind",
line: "bind = SUPER, Q, killactive", line: "bind = SUPER, Q, killactive",
expected: &KeyBinding{ expected: &HyprlandKeyBinding{
Mods: []string{"SUPER"}, Mods: []string{"SUPER"},
Key: "Q", Key: "Q",
Dispatcher: "killactive", Dispatcher: "killactive",
@@ -80,7 +80,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_with_params", name: "keybind_with_params",
line: "bind = SUPER, left, movefocus, l", line: "bind = SUPER, left, movefocus, l",
expected: &KeyBinding{ expected: &HyprlandKeyBinding{
Mods: []string{"SUPER"}, Mods: []string{"SUPER"},
Key: "left", Key: "left",
Dispatcher: "movefocus", Dispatcher: "movefocus",
@@ -91,7 +91,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_with_comment", name: "keybind_with_comment",
line: "bind = SUPER, T, exec, kitty # Open terminal", line: "bind = SUPER, T, exec, kitty # Open terminal",
expected: &KeyBinding{ expected: &HyprlandKeyBinding{
Mods: []string{"SUPER"}, Mods: []string{"SUPER"},
Key: "T", Key: "T",
Dispatcher: "exec", Dispatcher: "exec",
@@ -107,7 +107,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_multiple_mods", name: "keybind_multiple_mods",
line: "bind = SUPER+SHIFT, F, fullscreen, 0", line: "bind = SUPER+SHIFT, F, fullscreen, 0",
expected: &KeyBinding{ expected: &HyprlandKeyBinding{
Mods: []string{"SUPER", "SHIFT"}, Mods: []string{"SUPER", "SHIFT"},
Key: "F", Key: "F",
Dispatcher: "fullscreen", Dispatcher: "fullscreen",
@@ -118,7 +118,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_no_mods", name: "keybind_no_mods",
line: "bind = , Print, exec, screenshot", line: "bind = , Print, exec, screenshot",
expected: &KeyBinding{ expected: &HyprlandKeyBinding{
Mods: []string{}, Mods: []string{},
Key: "Print", Key: "Print",
Dispatcher: "exec", Dispatcher: "exec",
@@ -130,7 +130,7 @@ func TestGetKeybindAtLine(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
parser := NewParser() parser := NewHyprlandParser()
parser.contentLines = []string{tt.line} parser.contentLines = []string{tt.line}
result := parser.getKeybindAtLine(0) result := parser.getKeybindAtLine(0)
@@ -171,7 +171,7 @@ func TestGetKeybindAtLine(t *testing.T) {
} }
} }
func TestParseKeysWithSections(t *testing.T) { func TestHyprlandParseKeysWithSections(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "hyprland.conf") configFile := filepath.Join(tmpDir, "hyprland.conf")
@@ -191,9 +191,9 @@ bind = SUPER, T, exec, kitty # Terminal
t.Fatalf("Failed to write test config: %v", err) t.Fatalf("Failed to write test config: %v", err)
} }
section, err := ParseKeys(tmpDir) section, err := ParseHyprlandKeys(tmpDir)
if err != nil { if err != nil {
t.Fatalf("ParseKeys failed: %v", err) t.Fatalf("ParseHyprlandKeys failed: %v", err)
} }
if len(section.Children) != 2 { if len(section.Children) != 2 {
@@ -236,7 +236,7 @@ bind = SUPER, T, exec, kitty # Terminal
} }
} }
func TestParseKeysWithCommentBinds(t *testing.T) { func TestHyprlandParseKeysWithCommentBinds(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "test.conf") configFile := filepath.Join(tmpDir, "test.conf")
@@ -249,9 +249,9 @@ bind = SUPER, B, exec, app2
t.Fatalf("Failed to write test config: %v", err) t.Fatalf("Failed to write test config: %v", err)
} }
section, err := ParseKeys(tmpDir) section, err := ParseHyprlandKeys(tmpDir)
if err != nil { if err != nil {
t.Fatalf("ParseKeys failed: %v", err) t.Fatalf("ParseHyprlandKeys failed: %v", err)
} }
if len(section.Keybinds) != 3 { if len(section.Keybinds) != 3 {
@@ -269,7 +269,7 @@ bind = SUPER, B, exec, app2
} }
} }
func TestReadContentMultipleFiles(t *testing.T) { func TestHyprlandReadContentMultipleFiles(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
file1 := filepath.Join(tmpDir, "a.conf") file1 := filepath.Join(tmpDir, "a.conf")
@@ -285,7 +285,7 @@ func TestReadContentMultipleFiles(t *testing.T) {
t.Fatalf("Failed to write file2: %v", err) t.Fatalf("Failed to write file2: %v", err)
} }
parser := NewParser() parser := NewHyprlandParser()
if err := parser.ReadContent(tmpDir); err != nil { if err := parser.ReadContent(tmpDir); err != nil {
t.Fatalf("ReadContent failed: %v", err) t.Fatalf("ReadContent failed: %v", err)
} }
@@ -296,7 +296,7 @@ func TestReadContentMultipleFiles(t *testing.T) {
} }
} }
func TestReadContentErrors(t *testing.T) { func TestHyprlandReadContentErrors(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
path string path string
@@ -313,7 +313,7 @@ func TestReadContentErrors(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
_, err := ParseKeys(tt.path) _, err := ParseHyprlandKeys(tt.path)
if err == nil { if err == nil {
t.Error("Expected error, got nil") t.Error("Expected error, got nil")
} }
@@ -321,7 +321,7 @@ func TestReadContentErrors(t *testing.T) {
} }
} }
func TestReadContentWithTildeExpansion(t *testing.T) { func TestHyprlandReadContentWithTildeExpansion(t *testing.T) {
homeDir, err := os.UserHomeDir() homeDir, err := os.UserHomeDir()
if err != nil { if err != nil {
t.Skip("Cannot get home directory") t.Skip("Cannot get home directory")
@@ -343,7 +343,7 @@ func TestReadContentWithTildeExpansion(t *testing.T) {
t.Skip("Cannot create relative path") t.Skip("Cannot create relative path")
} }
parser := NewParser() parser := NewHyprlandParser()
tildePathMatch := "~/" + relPath tildePathMatch := "~/" + relPath
err = parser.ReadContent(tildePathMatch) err = parser.ReadContent(tildePathMatch)
@@ -352,8 +352,8 @@ func TestReadContentWithTildeExpansion(t *testing.T) {
} }
} }
func TestKeybindWithParamsContainingCommas(t *testing.T) { func TestHyprlandKeybindWithParamsContainingCommas(t *testing.T) {
parser := NewParser() parser := NewHyprlandParser()
parser.contentLines = []string{"bind = SUPER, R, exec, notify-send 'Title' 'Message, with comma'"} parser.contentLines = []string{"bind = SUPER, R, exec, notify-send 'Title' 'Message, with comma'"}
result := parser.getKeybindAtLine(0) result := parser.getKeybindAtLine(0)
@@ -368,7 +368,7 @@ func TestKeybindWithParamsContainingCommas(t *testing.T) {
} }
} }
func TestEmptyAndCommentLines(t *testing.T) { func TestHyprlandEmptyAndCommentLines(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "test.conf") configFile := filepath.Join(tmpDir, "test.conf")
@@ -385,9 +385,9 @@ bind = SUPER, T, exec, kitty
t.Fatalf("Failed to write test config: %v", err) t.Fatalf("Failed to write test config: %v", err)
} }
section, err := ParseKeys(tmpDir) section, err := ParseHyprlandKeys(tmpDir)
if err != nil { if err != nil {
t.Fatalf("ParseKeys failed: %v", err) t.Fatalf("ParseHyprlandKeys failed: %v", err)
} }
if len(section.Keybinds) != 2 { if len(section.Keybinds) != 2 {

View File

@@ -5,7 +5,6 @@ import (
"strings" "strings"
"github.com/AvengeMedia/DankMaterialShell/core/internal/keybinds" "github.com/AvengeMedia/DankMaterialShell/core/internal/keybinds"
"github.com/AvengeMedia/DankMaterialShell/core/internal/mangowc"
) )
type MangoWCProvider struct { type MangoWCProvider struct {
@@ -26,7 +25,7 @@ func (m *MangoWCProvider) Name() string {
} }
func (m *MangoWCProvider) GetCheatSheet() (*keybinds.CheatSheet, error) { func (m *MangoWCProvider) GetCheatSheet() (*keybinds.CheatSheet, error) {
keybinds_list, err := mangowc.ParseKeys(m.configPath) keybinds_list, err := ParseMangoWCKeys(m.configPath)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to parse mangowc config: %w", err) return nil, fmt.Errorf("failed to parse mangowc config: %w", err)
} }
@@ -83,7 +82,7 @@ func (m *MangoWCProvider) categorizeByCommand(command string) string {
} }
} }
func (m *MangoWCProvider) convertKeybind(kb *mangowc.KeyBinding) keybinds.Keybind { func (m *MangoWCProvider) convertKeybind(kb *MangoWCKeyBinding) keybinds.Keybind {
key := m.formatKey(kb) key := m.formatKey(kb)
desc := kb.Comment desc := kb.Comment
@@ -104,7 +103,7 @@ func (m *MangoWCProvider) generateDescription(command, params string) string {
return command return command
} }
func (m *MangoWCProvider) formatKey(kb *mangowc.KeyBinding) string { func (m *MangoWCProvider) formatKey(kb *MangoWCKeyBinding) string {
parts := make([]string, 0, len(kb.Mods)+1) parts := make([]string, 0, len(kb.Mods)+1)
parts = append(parts, kb.Mods...) parts = append(parts, kb.Mods...)
parts = append(parts, kb.Key) parts = append(parts, kb.Key)

View File

@@ -1,4 +1,4 @@
package mangowc package providers
import ( import (
"os" "os"
@@ -8,12 +8,12 @@ import (
) )
const ( const (
HideComment = "[hidden]" MangoWCHideComment = "[hidden]"
) )
var ModSeparators = []rune{'+', ' '} var MangoWCModSeparators = []rune{'+', ' '}
type KeyBinding struct { type MangoWCKeyBinding struct {
Mods []string `json:"mods"` Mods []string `json:"mods"`
Key string `json:"key"` Key string `json:"key"`
Command string `json:"command"` Command string `json:"command"`
@@ -21,19 +21,19 @@ type KeyBinding struct {
Comment string `json:"comment"` Comment string `json:"comment"`
} }
type Parser struct { type MangoWCParser struct {
contentLines []string contentLines []string
readingLine int readingLine int
} }
func NewParser() *Parser { func NewMangoWCParser() *MangoWCParser {
return &Parser{ return &MangoWCParser{
contentLines: []string{}, contentLines: []string{},
readingLine: 0, readingLine: 0,
} }
} }
func (p *Parser) ReadContent(path string) error { func (p *MangoWCParser) ReadContent(path string) error {
expandedPath := os.ExpandEnv(path) expandedPath := os.ExpandEnv(path)
expandedPath = filepath.Clean(expandedPath) expandedPath = filepath.Clean(expandedPath)
if strings.HasPrefix(expandedPath, "~") { if strings.HasPrefix(expandedPath, "~") {
@@ -82,7 +82,7 @@ func (p *Parser) ReadContent(path string) error {
return nil return nil
} }
func autogenerateComment(command, params string) string { func mangowcAutogenerateComment(command, params string) string {
switch command { switch command {
case "spawn", "spawn_shell": case "spawn", "spawn_shell":
return params return params
@@ -196,7 +196,7 @@ func autogenerateComment(command, params string) string {
} }
} }
func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding { func (p *MangoWCParser) getKeybindAtLine(lineNumber int) *MangoWCKeyBinding {
if lineNumber >= len(p.contentLines) { if lineNumber >= len(p.contentLines) {
return nil return nil
} }
@@ -220,7 +220,7 @@ func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding {
comment = strings.TrimSpace(parts[1]) comment = strings.TrimSpace(parts[1])
} }
if strings.HasPrefix(comment, HideComment) { if strings.HasPrefix(comment, MangoWCHideComment) {
return nil return nil
} }
@@ -239,16 +239,16 @@ func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding {
} }
if comment == "" { if comment == "" {
comment = autogenerateComment(command, params) comment = mangowcAutogenerateComment(command, params)
} }
var modList []string var modList []string
if mods != "" && !strings.EqualFold(mods, "none") { if mods != "" && !strings.EqualFold(mods, "none") {
modstring := mods + string(ModSeparators[0]) modstring := mods + string(MangoWCModSeparators[0])
p := 0 p := 0
for index, char := range modstring { for index, char := range modstring {
isModSep := false isModSep := false
for _, sep := range ModSeparators { for _, sep := range MangoWCModSeparators {
if char == sep { if char == sep {
isModSep = true isModSep = true
break break
@@ -265,7 +265,7 @@ func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding {
_ = bindType _ = bindType
return &KeyBinding{ return &MangoWCKeyBinding{
Mods: modList, Mods: modList,
Key: key, Key: key,
Command: command, Command: command,
@@ -274,8 +274,8 @@ func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding {
} }
} }
func (p *Parser) ParseKeys() []KeyBinding { func (p *MangoWCParser) ParseKeys() []MangoWCKeyBinding {
var keybinds []KeyBinding var keybinds []MangoWCKeyBinding
for lineNumber := 0; lineNumber < len(p.contentLines); lineNumber++ { for lineNumber := 0; lineNumber < len(p.contentLines); lineNumber++ {
line := p.contentLines[lineNumber] line := p.contentLines[lineNumber]
@@ -296,8 +296,8 @@ func (p *Parser) ParseKeys() []KeyBinding {
return keybinds return keybinds
} }
func ParseKeys(path string) ([]KeyBinding, error) { func ParseMangoWCKeys(path string) ([]MangoWCKeyBinding, error) {
parser := NewParser() parser := NewMangoWCParser()
if err := parser.ReadContent(path); err != nil { if err := parser.ReadContent(path); err != nil {
return nil, err return nil, err
} }

View File

@@ -1,4 +1,4 @@
package mangowc package providers
import ( import (
"os" "os"
@@ -6,7 +6,7 @@ import (
"testing" "testing"
) )
func TestAutogenerateComment(t *testing.T) { func TestMangoWCAutogenerateComment(t *testing.T) {
tests := []struct { tests := []struct {
command string command string
params string params string
@@ -60,25 +60,25 @@ func TestAutogenerateComment(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.command+"_"+tt.params, func(t *testing.T) { t.Run(tt.command+"_"+tt.params, func(t *testing.T) {
result := autogenerateComment(tt.command, tt.params) result := mangowcAutogenerateComment(tt.command, tt.params)
if result != tt.expected { if result != tt.expected {
t.Errorf("autogenerateComment(%q, %q) = %q, want %q", t.Errorf("mangowcAutogenerateComment(%q, %q) = %q, want %q",
tt.command, tt.params, result, tt.expected) tt.command, tt.params, result, tt.expected)
} }
}) })
} }
} }
func TestGetKeybindAtLine(t *testing.T) { func TestMangoWCGetKeybindAtLine(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
line string line string
expected *KeyBinding expected *MangoWCKeyBinding
}{ }{
{ {
name: "basic_keybind", name: "basic_keybind",
line: "bind=ALT,q,killclient,", line: "bind=ALT,q,killclient,",
expected: &KeyBinding{ expected: &MangoWCKeyBinding{
Mods: []string{"ALT"}, Mods: []string{"ALT"},
Key: "q", Key: "q",
Command: "killclient", Command: "killclient",
@@ -89,7 +89,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_with_params", name: "keybind_with_params",
line: "bind=ALT,Left,focusdir,left", line: "bind=ALT,Left,focusdir,left",
expected: &KeyBinding{ expected: &MangoWCKeyBinding{
Mods: []string{"ALT"}, Mods: []string{"ALT"},
Key: "Left", Key: "Left",
Command: "focusdir", Command: "focusdir",
@@ -100,7 +100,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_with_comment", name: "keybind_with_comment",
line: "bind=Alt,t,spawn,kitty # Open terminal", line: "bind=Alt,t,spawn,kitty # Open terminal",
expected: &KeyBinding{ expected: &MangoWCKeyBinding{
Mods: []string{"Alt"}, Mods: []string{"Alt"},
Key: "t", Key: "t",
Command: "spawn", Command: "spawn",
@@ -116,7 +116,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_multiple_mods", name: "keybind_multiple_mods",
line: "bind=SUPER+SHIFT,Up,exchange_client,up", line: "bind=SUPER+SHIFT,Up,exchange_client,up",
expected: &KeyBinding{ expected: &MangoWCKeyBinding{
Mods: []string{"SUPER", "SHIFT"}, Mods: []string{"SUPER", "SHIFT"},
Key: "Up", Key: "Up",
Command: "exchange_client", Command: "exchange_client",
@@ -127,7 +127,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_no_mods", name: "keybind_no_mods",
line: "bind=NONE,Print,spawn,screenshot", line: "bind=NONE,Print,spawn,screenshot",
expected: &KeyBinding{ expected: &MangoWCKeyBinding{
Mods: []string{}, Mods: []string{},
Key: "Print", Key: "Print",
Command: "spawn", Command: "spawn",
@@ -138,7 +138,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_multiple_params", name: "keybind_multiple_params",
line: "bind=Ctrl,1,view,1,0", line: "bind=Ctrl,1,view,1,0",
expected: &KeyBinding{ expected: &MangoWCKeyBinding{
Mods: []string{"Ctrl"}, Mods: []string{"Ctrl"},
Key: "1", Key: "1",
Command: "view", Command: "view",
@@ -149,7 +149,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "bindl_flag", name: "bindl_flag",
line: "bindl=SUPER+ALT,l,spawn,dms ipc call lock lock", line: "bindl=SUPER+ALT,l,spawn,dms ipc call lock lock",
expected: &KeyBinding{ expected: &MangoWCKeyBinding{
Mods: []string{"SUPER", "ALT"}, Mods: []string{"SUPER", "ALT"},
Key: "l", Key: "l",
Command: "spawn", Command: "spawn",
@@ -160,7 +160,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_with_spaces", name: "keybind_with_spaces",
line: "bind = SUPER, r, reload_config", line: "bind = SUPER, r, reload_config",
expected: &KeyBinding{ expected: &MangoWCKeyBinding{
Mods: []string{"SUPER"}, Mods: []string{"SUPER"},
Key: "r", Key: "r",
Command: "reload_config", Command: "reload_config",
@@ -172,7 +172,7 @@ func TestGetKeybindAtLine(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
parser := NewParser() parser := NewMangoWCParser()
parser.contentLines = []string{tt.line} parser.contentLines = []string{tt.line}
result := parser.getKeybindAtLine(0) result := parser.getKeybindAtLine(0)
@@ -213,7 +213,7 @@ func TestGetKeybindAtLine(t *testing.T) {
} }
} }
func TestParseKeys(t *testing.T) { func TestMangoWCParseKeys(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "config.conf") configFile := filepath.Join(tmpDir, "config.conf")
@@ -242,9 +242,9 @@ bind=Ctrl,2,view,2,0
t.Fatalf("Failed to write test config: %v", err) t.Fatalf("Failed to write test config: %v", err)
} }
keybinds, err := ParseKeys(configFile) keybinds, err := ParseMangoWCKeys(configFile)
if err != nil { if err != nil {
t.Fatalf("ParseKeys failed: %v", err) t.Fatalf("ParseMangoWCKeys failed: %v", err)
} }
expectedCount := 7 expectedCount := 7
@@ -267,7 +267,7 @@ bind=Ctrl,2,view,2,0
} }
} }
func TestReadContentMultipleFiles(t *testing.T) { func TestMangoWCReadContentMultipleFiles(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
file1 := filepath.Join(tmpDir, "a.conf") file1 := filepath.Join(tmpDir, "a.conf")
@@ -283,7 +283,7 @@ func TestReadContentMultipleFiles(t *testing.T) {
t.Fatalf("Failed to write file2: %v", err) t.Fatalf("Failed to write file2: %v", err)
} }
parser := NewParser() parser := NewMangoWCParser()
if err := parser.ReadContent(tmpDir); err != nil { if err := parser.ReadContent(tmpDir); err != nil {
t.Fatalf("ReadContent failed: %v", err) t.Fatalf("ReadContent failed: %v", err)
} }
@@ -294,7 +294,7 @@ func TestReadContentMultipleFiles(t *testing.T) {
} }
} }
func TestReadContentSingleFile(t *testing.T) { func TestMangoWCReadContentSingleFile(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "config.conf") configFile := filepath.Join(tmpDir, "config.conf")
@@ -304,7 +304,7 @@ func TestReadContentSingleFile(t *testing.T) {
t.Fatalf("Failed to write config: %v", err) t.Fatalf("Failed to write config: %v", err)
} }
parser := NewParser() parser := NewMangoWCParser()
if err := parser.ReadContent(configFile); err != nil { if err := parser.ReadContent(configFile); err != nil {
t.Fatalf("ReadContent failed: %v", err) t.Fatalf("ReadContent failed: %v", err)
} }
@@ -315,7 +315,7 @@ func TestReadContentSingleFile(t *testing.T) {
} }
} }
func TestReadContentErrors(t *testing.T) { func TestMangoWCReadContentErrors(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
path string path string
@@ -332,7 +332,7 @@ func TestReadContentErrors(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
_, err := ParseKeys(tt.path) _, err := ParseMangoWCKeys(tt.path)
if err == nil { if err == nil {
t.Error("Expected error, got nil") t.Error("Expected error, got nil")
} }
@@ -340,7 +340,7 @@ func TestReadContentErrors(t *testing.T) {
} }
} }
func TestReadContentWithTildeExpansion(t *testing.T) { func TestMangoWCReadContentWithTildeExpansion(t *testing.T) {
homeDir, err := os.UserHomeDir() homeDir, err := os.UserHomeDir()
if err != nil { if err != nil {
t.Skip("Cannot get home directory") t.Skip("Cannot get home directory")
@@ -362,7 +362,7 @@ func TestReadContentWithTildeExpansion(t *testing.T) {
t.Skip("Cannot create relative path") t.Skip("Cannot create relative path")
} }
parser := NewParser() parser := NewMangoWCParser()
tildePathMatch := "~/" + relPath tildePathMatch := "~/" + relPath
err = parser.ReadContent(tildePathMatch) err = parser.ReadContent(tildePathMatch)
@@ -371,7 +371,7 @@ func TestReadContentWithTildeExpansion(t *testing.T) {
} }
} }
func TestEmptyAndCommentLines(t *testing.T) { func TestMangoWCEmptyAndCommentLines(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "config.conf") configFile := filepath.Join(tmpDir, "config.conf")
@@ -388,9 +388,9 @@ bind=Alt,t,spawn,kitty
t.Fatalf("Failed to write test config: %v", err) t.Fatalf("Failed to write test config: %v", err)
} }
keybinds, err := ParseKeys(configFile) keybinds, err := ParseMangoWCKeys(configFile)
if err != nil { if err != nil {
t.Fatalf("ParseKeys failed: %v", err) t.Fatalf("ParseMangoWCKeys failed: %v", err)
} }
if len(keybinds) != 2 { if len(keybinds) != 2 {
@@ -398,7 +398,7 @@ bind=Alt,t,spawn,kitty
} }
} }
func TestInvalidBindLines(t *testing.T) { func TestMangoWCInvalidBindLines(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
line string line string
@@ -419,7 +419,7 @@ func TestInvalidBindLines(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
parser := NewParser() parser := NewMangoWCParser()
parser.contentLines = []string{tt.line} parser.contentLines = []string{tt.line}
result := parser.getKeybindAtLine(0) result := parser.getKeybindAtLine(0)
@@ -430,7 +430,7 @@ func TestInvalidBindLines(t *testing.T) {
} }
} }
func TestRealWorldConfig(t *testing.T) { func TestMangoWCRealWorldConfig(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "config.conf") configFile := filepath.Join(tmpDir, "config.conf")
@@ -462,9 +462,9 @@ bind=Ctrl,3,view,3,0
t.Fatalf("Failed to write test config: %v", err) t.Fatalf("Failed to write test config: %v", err)
} }
keybinds, err := ParseKeys(configFile) keybinds, err := ParseMangoWCKeys(configFile)
if err != nil { if err != nil {
t.Fatalf("ParseKeys failed: %v", err) t.Fatalf("ParseMangoWCKeys failed: %v", err)
} }
if len(keybinds) < 14 { if len(keybinds) < 14 {

View File

@@ -4,8 +4,6 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"testing" "testing"
"github.com/AvengeMedia/DankMaterialShell/core/internal/mangowc"
) )
func TestMangoWCProviderName(t *testing.T) { func TestMangoWCProviderName(t *testing.T) {
@@ -88,12 +86,12 @@ func TestMangoWCCategorizeByCommand(t *testing.T) {
func TestMangoWCFormatKey(t *testing.T) { func TestMangoWCFormatKey(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
keybind *mangowc.KeyBinding keybind *MangoWCKeyBinding
expected string expected string
}{ }{
{ {
name: "single_mod", name: "single_mod",
keybind: &mangowc.KeyBinding{ keybind: &MangoWCKeyBinding{
Mods: []string{"ALT"}, Mods: []string{"ALT"},
Key: "q", Key: "q",
}, },
@@ -101,7 +99,7 @@ func TestMangoWCFormatKey(t *testing.T) {
}, },
{ {
name: "multiple_mods", name: "multiple_mods",
keybind: &mangowc.KeyBinding{ keybind: &MangoWCKeyBinding{
Mods: []string{"SUPER", "SHIFT"}, Mods: []string{"SUPER", "SHIFT"},
Key: "Up", Key: "Up",
}, },
@@ -109,7 +107,7 @@ func TestMangoWCFormatKey(t *testing.T) {
}, },
{ {
name: "no_mods", name: "no_mods",
keybind: &mangowc.KeyBinding{ keybind: &MangoWCKeyBinding{
Mods: []string{}, Mods: []string{},
Key: "Print", Key: "Print",
}, },
@@ -131,13 +129,13 @@ func TestMangoWCFormatKey(t *testing.T) {
func TestMangoWCConvertKeybind(t *testing.T) { func TestMangoWCConvertKeybind(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
keybind *mangowc.KeyBinding keybind *MangoWCKeyBinding
wantKey string wantKey string
wantDesc string wantDesc string
}{ }{
{ {
name: "with_comment", name: "with_comment",
keybind: &mangowc.KeyBinding{ keybind: &MangoWCKeyBinding{
Mods: []string{"ALT"}, Mods: []string{"ALT"},
Key: "t", Key: "t",
Command: "spawn", Command: "spawn",
@@ -149,7 +147,7 @@ func TestMangoWCConvertKeybind(t *testing.T) {
}, },
{ {
name: "without_comment", name: "without_comment",
keybind: &mangowc.KeyBinding{ keybind: &MangoWCKeyBinding{
Mods: []string{"SUPER"}, Mods: []string{"SUPER"},
Key: "r", Key: "r",
Command: "reload_config", Command: "reload_config",
@@ -161,7 +159,7 @@ func TestMangoWCConvertKeybind(t *testing.T) {
}, },
{ {
name: "with_params_no_comment", name: "with_params_no_comment",
keybind: &mangowc.KeyBinding{ keybind: &MangoWCKeyBinding{
Mods: []string{"CTRL"}, Mods: []string{"CTRL"},
Key: "1", Key: "1",
Command: "view", Command: "view",

View File

@@ -5,7 +5,6 @@ import (
"strings" "strings"
"github.com/AvengeMedia/DankMaterialShell/core/internal/keybinds" "github.com/AvengeMedia/DankMaterialShell/core/internal/keybinds"
"github.com/AvengeMedia/DankMaterialShell/core/internal/sway"
) )
type SwayProvider struct { type SwayProvider struct {
@@ -26,7 +25,7 @@ func (s *SwayProvider) Name() string {
} }
func (s *SwayProvider) GetCheatSheet() (*keybinds.CheatSheet, error) { func (s *SwayProvider) GetCheatSheet() (*keybinds.CheatSheet, error) {
section, err := sway.ParseKeys(s.configPath) section, err := ParseSwayKeys(s.configPath)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to parse sway config: %w", err) return nil, fmt.Errorf("failed to parse sway config: %w", err)
} }
@@ -41,7 +40,7 @@ func (s *SwayProvider) GetCheatSheet() (*keybinds.CheatSheet, error) {
}, nil }, nil
} }
func (s *SwayProvider) convertSection(section *sway.Section, subcategory string, categorizedBinds map[string][]keybinds.Keybind) { func (s *SwayProvider) convertSection(section *SwaySection, subcategory string, categorizedBinds map[string][]keybinds.Keybind) {
currentSubcat := subcategory currentSubcat := subcategory
if section.Name != "" { if section.Name != "" {
currentSubcat = section.Name currentSubcat = section.Name
@@ -89,7 +88,7 @@ func (s *SwayProvider) categorizeByCommand(command string) string {
} }
} }
func (s *SwayProvider) convertKeybind(kb *sway.KeyBinding, subcategory string) keybinds.Keybind { func (s *SwayProvider) convertKeybind(kb *SwayKeyBinding, subcategory string) keybinds.Keybind {
key := s.formatKey(kb) key := s.formatKey(kb)
desc := kb.Comment desc := kb.Comment
@@ -104,7 +103,7 @@ func (s *SwayProvider) convertKeybind(kb *sway.KeyBinding, subcategory string) k
} }
} }
func (s *SwayProvider) formatKey(kb *sway.KeyBinding) string { func (s *SwayProvider) formatKey(kb *SwayKeyBinding) string {
parts := make([]string, 0, len(kb.Mods)+1) parts := make([]string, 0, len(kb.Mods)+1)
parts = append(parts, kb.Mods...) parts = append(parts, kb.Mods...)
parts = append(parts, kb.Key) parts = append(parts, kb.Key)

View File

@@ -1,4 +1,4 @@
package sway package providers
import ( import (
"os" "os"
@@ -8,40 +8,40 @@ import (
) )
const ( const (
TitleRegex = "#+!" SwayTitleRegex = "#+!"
HideComment = "[hidden]" SwayHideComment = "[hidden]"
) )
var ModSeparators = []rune{'+', ' '} var SwayModSeparators = []rune{'+', ' '}
type KeyBinding struct { type SwayKeyBinding struct {
Mods []string `json:"mods"` Mods []string `json:"mods"`
Key string `json:"key"` Key string `json:"key"`
Command string `json:"command"` Command string `json:"command"`
Comment string `json:"comment"` Comment string `json:"comment"`
} }
type Section struct { type SwaySection struct {
Children []Section `json:"children"` Children []SwaySection `json:"children"`
Keybinds []KeyBinding `json:"keybinds"` Keybinds []SwayKeyBinding `json:"keybinds"`
Name string `json:"name"` Name string `json:"name"`
} }
type Parser struct { type SwayParser struct {
contentLines []string contentLines []string
readingLine int readingLine int
variables map[string]string variables map[string]string
} }
func NewParser() *Parser { func NewSwayParser() *SwayParser {
return &Parser{ return &SwayParser{
contentLines: []string{}, contentLines: []string{},
readingLine: 0, readingLine: 0,
variables: make(map[string]string), variables: make(map[string]string),
} }
} }
func (p *Parser) ReadContent(path string) error { func (p *SwayParser) ReadContent(path string) error {
expandedPath := os.ExpandEnv(path) expandedPath := os.ExpandEnv(path)
expandedPath = filepath.Clean(expandedPath) expandedPath = filepath.Clean(expandedPath)
if strings.HasPrefix(expandedPath, "~") { if strings.HasPrefix(expandedPath, "~") {
@@ -88,7 +88,7 @@ func (p *Parser) ReadContent(path string) error {
return nil return nil
} }
func (p *Parser) parseVariables() { func (p *SwayParser) parseVariables() {
setRegex := regexp.MustCompile(`^\s*set\s+\$(\w+)\s+(.+)$`) setRegex := regexp.MustCompile(`^\s*set\s+\$(\w+)\s+(.+)$`)
for _, line := range p.contentLines { for _, line := range p.contentLines {
matches := setRegex.FindStringSubmatch(line) matches := setRegex.FindStringSubmatch(line)
@@ -100,7 +100,7 @@ func (p *Parser) parseVariables() {
} }
} }
func (p *Parser) expandVariables(text string) string { func (p *SwayParser) expandVariables(text string) string {
result := text result := text
for varName, varValue := range p.variables { for varName, varValue := range p.variables {
result = strings.ReplaceAll(result, "$"+varName, varValue) result = strings.ReplaceAll(result, "$"+varName, varValue)
@@ -108,7 +108,7 @@ func (p *Parser) expandVariables(text string) string {
return result return result
} }
func autogenerateComment(command string) string { func swayAutogenerateComment(command string) string {
command = strings.TrimSpace(command) command = strings.TrimSpace(command)
if strings.HasPrefix(command, "exec ") { if strings.HasPrefix(command, "exec ") {
@@ -200,7 +200,7 @@ func autogenerateComment(command string) string {
} }
} }
func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding { func (p *SwayParser) getKeybindAtLine(lineNumber int) *SwayKeyBinding {
if lineNumber >= len(p.contentLines) { if lineNumber >= len(p.contentLines) {
return nil return nil
} }
@@ -223,7 +223,7 @@ func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding {
comment = strings.TrimSpace(parts[1]) comment = strings.TrimSpace(parts[1])
} }
if strings.HasPrefix(comment, HideComment) { if strings.HasPrefix(comment, SwayHideComment) {
return nil return nil
} }
@@ -249,11 +249,11 @@ func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding {
var modList []string var modList []string
var key string var key string
modstring := keyCombo + string(ModSeparators[0]) modstring := keyCombo + string(SwayModSeparators[0])
pos := 0 pos := 0
for index, char := range modstring { for index, char := range modstring {
isModSep := false isModSep := false
for _, sep := range ModSeparators { for _, sep := range SwayModSeparators {
if char == sep { if char == sep {
isModSep = true isModSep = true
break break
@@ -262,7 +262,7 @@ func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding {
if isModSep { if isModSep {
if index-pos > 0 { if index-pos > 0 {
part := modstring[pos:index] part := modstring[pos:index]
if isMod(part) { if swayIsMod(part) {
modList = append(modList, part) modList = append(modList, part)
} else { } else {
key = part key = part
@@ -273,12 +273,12 @@ func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding {
} }
if comment == "" { if comment == "" {
comment = autogenerateComment(command) comment = swayAutogenerateComment(command)
} }
_ = flags _ = flags
return &KeyBinding{ return &SwayKeyBinding{
Mods: modList, Mods: modList,
Key: key, Key: key,
Command: command, Command: command,
@@ -286,7 +286,7 @@ func (p *Parser) getKeybindAtLine(lineNumber int) *KeyBinding {
} }
} }
func isMod(s string) bool { func swayIsMod(s string) bool {
s = strings.ToLower(s) s = strings.ToLower(s)
if s == "mod1" || s == "mod2" || s == "mod3" || s == "mod4" || s == "mod5" || if s == "mod1" || s == "mod2" || s == "mod3" || s == "mod4" || s == "mod5" ||
s == "shift" || s == "control" || s == "ctrl" || s == "alt" || s == "super" || s == "shift" || s == "control" || s == "ctrl" || s == "alt" || s == "super" ||
@@ -307,8 +307,8 @@ func isMod(s string) bool {
return false return false
} }
func (p *Parser) getBindsRecursive(currentContent *Section, scope int) *Section { func (p *SwayParser) getBindsRecursive(currentContent *SwaySection, scope int) *SwaySection {
titleRegex := regexp.MustCompile(TitleRegex) titleRegex := regexp.MustCompile(SwayTitleRegex)
for p.readingLine < len(p.contentLines) { for p.readingLine < len(p.contentLines) {
line := p.contentLines[p.readingLine] line := p.contentLines[p.readingLine]
@@ -325,9 +325,9 @@ func (p *Parser) getBindsRecursive(currentContent *Section, scope int) *Section
sectionName := strings.TrimSpace(line[headingScope+1:]) sectionName := strings.TrimSpace(line[headingScope+1:])
p.readingLine++ p.readingLine++
childSection := &Section{ childSection := &SwaySection{
Children: []Section{}, Children: []SwaySection{},
Keybinds: []KeyBinding{}, Keybinds: []SwayKeyBinding{},
Name: sectionName, Name: sectionName,
} }
result := p.getBindsRecursive(childSection, headingScope) result := p.getBindsRecursive(childSection, headingScope)
@@ -348,18 +348,18 @@ func (p *Parser) getBindsRecursive(currentContent *Section, scope int) *Section
return currentContent return currentContent
} }
func (p *Parser) ParseKeys() *Section { func (p *SwayParser) ParseKeys() *SwaySection {
p.readingLine = 0 p.readingLine = 0
rootSection := &Section{ rootSection := &SwaySection{
Children: []Section{}, Children: []SwaySection{},
Keybinds: []KeyBinding{}, Keybinds: []SwayKeyBinding{},
Name: "", Name: "",
} }
return p.getBindsRecursive(rootSection, 0) return p.getBindsRecursive(rootSection, 0)
} }
func ParseKeys(path string) (*Section, error) { func ParseSwayKeys(path string) (*SwaySection, error) {
parser := NewParser() parser := NewSwayParser()
if err := parser.ReadContent(path); err != nil { if err := parser.ReadContent(path); err != nil {
return nil, err return nil, err
} }

View File

@@ -1,4 +1,4 @@
package sway package providers
import ( import (
"os" "os"
@@ -6,7 +6,7 @@ import (
"testing" "testing"
) )
func TestAutogenerateComment(t *testing.T) { func TestSwayAutogenerateComment(t *testing.T) {
tests := []struct { tests := []struct {
command string command string
expected string expected string
@@ -46,25 +46,25 @@ func TestAutogenerateComment(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.command, func(t *testing.T) { t.Run(tt.command, func(t *testing.T) {
result := autogenerateComment(tt.command) result := swayAutogenerateComment(tt.command)
if result != tt.expected { if result != tt.expected {
t.Errorf("autogenerateComment(%q) = %q, want %q", t.Errorf("swayAutogenerateComment(%q) = %q, want %q",
tt.command, result, tt.expected) tt.command, result, tt.expected)
} }
}) })
} }
} }
func TestGetKeybindAtLine(t *testing.T) { func TestSwayGetKeybindAtLine(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
line string line string
expected *KeyBinding expected *SwayKeyBinding
}{ }{
{ {
name: "basic_keybind", name: "basic_keybind",
line: "bindsym Mod4+q kill", line: "bindsym Mod4+q kill",
expected: &KeyBinding{ expected: &SwayKeyBinding{
Mods: []string{"Mod4"}, Mods: []string{"Mod4"},
Key: "q", Key: "q",
Command: "kill", Command: "kill",
@@ -74,7 +74,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_with_exec", name: "keybind_with_exec",
line: "bindsym Mod4+t exec kitty", line: "bindsym Mod4+t exec kitty",
expected: &KeyBinding{ expected: &SwayKeyBinding{
Mods: []string{"Mod4"}, Mods: []string{"Mod4"},
Key: "t", Key: "t",
Command: "exec kitty", Command: "exec kitty",
@@ -84,7 +84,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_with_comment", name: "keybind_with_comment",
line: "bindsym Mod4+Space exec dms ipc call spotlight toggle # Open launcher", line: "bindsym Mod4+Space exec dms ipc call spotlight toggle # Open launcher",
expected: &KeyBinding{ expected: &SwayKeyBinding{
Mods: []string{"Mod4"}, Mods: []string{"Mod4"},
Key: "Space", Key: "Space",
Command: "exec dms ipc call spotlight toggle", Command: "exec dms ipc call spotlight toggle",
@@ -99,7 +99,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_multiple_mods", name: "keybind_multiple_mods",
line: "bindsym Mod4+Shift+e exit", line: "bindsym Mod4+Shift+e exit",
expected: &KeyBinding{ expected: &SwayKeyBinding{
Mods: []string{"Mod4", "Shift"}, Mods: []string{"Mod4", "Shift"},
Key: "e", Key: "e",
Command: "exit", Command: "exit",
@@ -109,7 +109,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_no_mods", name: "keybind_no_mods",
line: "bindsym Print exec grim screenshot.png", line: "bindsym Print exec grim screenshot.png",
expected: &KeyBinding{ expected: &SwayKeyBinding{
Mods: []string{}, Mods: []string{},
Key: "Print", Key: "Print",
Command: "exec grim screenshot.png", Command: "exec grim screenshot.png",
@@ -119,7 +119,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_with_flags", name: "keybind_with_flags",
line: "bindsym --release Mod4+x exec notify-send released", line: "bindsym --release Mod4+x exec notify-send released",
expected: &KeyBinding{ expected: &SwayKeyBinding{
Mods: []string{"Mod4"}, Mods: []string{"Mod4"},
Key: "x", Key: "x",
Command: "exec notify-send released", Command: "exec notify-send released",
@@ -129,7 +129,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_focus_direction", name: "keybind_focus_direction",
line: "bindsym Mod4+Left focus left", line: "bindsym Mod4+Left focus left",
expected: &KeyBinding{ expected: &SwayKeyBinding{
Mods: []string{"Mod4"}, Mods: []string{"Mod4"},
Key: "Left", Key: "Left",
Command: "focus left", Command: "focus left",
@@ -139,7 +139,7 @@ func TestGetKeybindAtLine(t *testing.T) {
{ {
name: "keybind_workspace", name: "keybind_workspace",
line: "bindsym Mod4+1 workspace number 1", line: "bindsym Mod4+1 workspace number 1",
expected: &KeyBinding{ expected: &SwayKeyBinding{
Mods: []string{"Mod4"}, Mods: []string{"Mod4"},
Key: "1", Key: "1",
Command: "workspace number 1", Command: "workspace number 1",
@@ -150,7 +150,7 @@ func TestGetKeybindAtLine(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
parser := NewParser() parser := NewSwayParser()
parser.contentLines = []string{tt.line} parser.contentLines = []string{tt.line}
result := parser.getKeybindAtLine(0) result := parser.getKeybindAtLine(0)
@@ -188,7 +188,7 @@ func TestGetKeybindAtLine(t *testing.T) {
} }
} }
func TestVariableExpansion(t *testing.T) { func TestSwayVariableExpansion(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "config") configFile := filepath.Join(tmpDir, "config")
@@ -204,9 +204,9 @@ bindsym $mod+d exec $menu
t.Fatalf("Failed to write test config: %v", err) t.Fatalf("Failed to write test config: %v", err)
} }
section, err := ParseKeys(configFile) section, err := ParseSwayKeys(configFile)
if err != nil { if err != nil {
t.Fatalf("ParseKeys failed: %v", err) t.Fatalf("ParseSwayKeys failed: %v", err)
} }
if len(section.Keybinds) != 2 { if len(section.Keybinds) != 2 {
@@ -229,7 +229,7 @@ bindsym $mod+d exec $menu
} }
} }
func TestParseKeysWithSections(t *testing.T) { func TestSwayParseKeysWithSections(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "config") configFile := filepath.Join(tmpDir, "config")
@@ -251,9 +251,9 @@ bindsym $mod+t exec kitty # Terminal
t.Fatalf("Failed to write test config: %v", err) t.Fatalf("Failed to write test config: %v", err)
} }
section, err := ParseKeys(tmpDir) section, err := ParseSwayKeys(tmpDir)
if err != nil { if err != nil {
t.Fatalf("ParseKeys failed: %v", err) t.Fatalf("ParseSwayKeys failed: %v", err)
} }
if len(section.Children) != 2 { if len(section.Children) != 2 {
@@ -296,7 +296,7 @@ bindsym $mod+t exec kitty # Terminal
} }
} }
func TestReadContentErrors(t *testing.T) { func TestSwayReadContentErrors(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
path string path string
@@ -313,7 +313,7 @@ func TestReadContentErrors(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
_, err := ParseKeys(tt.path) _, err := ParseSwayKeys(tt.path)
if err == nil { if err == nil {
t.Error("Expected error, got nil") t.Error("Expected error, got nil")
} }
@@ -321,7 +321,7 @@ func TestReadContentErrors(t *testing.T) {
} }
} }
func TestReadContentWithTildeExpansion(t *testing.T) { func TestSwayReadContentWithTildeExpansion(t *testing.T) {
homeDir, err := os.UserHomeDir() homeDir, err := os.UserHomeDir()
if err != nil { if err != nil {
t.Skip("Cannot get home directory") t.Skip("Cannot get home directory")
@@ -343,7 +343,7 @@ func TestReadContentWithTildeExpansion(t *testing.T) {
t.Skip("Cannot create relative path") t.Skip("Cannot create relative path")
} }
parser := NewParser() parser := NewSwayParser()
tildePathMatch := "~/" + relPath tildePathMatch := "~/" + relPath
err = parser.ReadContent(tildePathMatch) err = parser.ReadContent(tildePathMatch)
@@ -352,7 +352,7 @@ func TestReadContentWithTildeExpansion(t *testing.T) {
} }
} }
func TestEmptyAndCommentLines(t *testing.T) { func TestSwayEmptyAndCommentLines(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "config") configFile := filepath.Join(tmpDir, "config")
@@ -369,9 +369,9 @@ bindsym Mod4+t exec kitty
t.Fatalf("Failed to write test config: %v", err) t.Fatalf("Failed to write test config: %v", err)
} }
section, err := ParseKeys(configFile) section, err := ParseSwayKeys(configFile)
if err != nil { if err != nil {
t.Fatalf("ParseKeys failed: %v", err) t.Fatalf("ParseSwayKeys failed: %v", err)
} }
if len(section.Keybinds) != 2 { if len(section.Keybinds) != 2 {
@@ -379,7 +379,7 @@ bindsym Mod4+t exec kitty
} }
} }
func TestRealWorldConfig(t *testing.T) { func TestSwayRealWorldConfig(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "config") configFile := filepath.Join(tmpDir, "config")
@@ -408,9 +408,9 @@ bindsym $mod+Shift+1 move container to workspace number 1
t.Fatalf("Failed to write test config: %v", err) t.Fatalf("Failed to write test config: %v", err)
} }
section, err := ParseKeys(configFile) section, err := ParseSwayKeys(configFile)
if err != nil { if err != nil {
t.Fatalf("ParseKeys failed: %v", err) t.Fatalf("ParseSwayKeys failed: %v", err)
} }
if len(section.Keybinds) < 9 { if len(section.Keybinds) < 9 {
@@ -444,7 +444,7 @@ bindsym $mod+Shift+1 move container to workspace number 1
} }
} }
func TestIsMod(t *testing.T) { func TestSwayIsMod(t *testing.T) {
tests := []struct { tests := []struct {
input string input string
expected bool expected bool
@@ -462,9 +462,9 @@ func TestIsMod(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.input, func(t *testing.T) { t.Run(tt.input, func(t *testing.T) {
result := isMod(tt.input) result := swayIsMod(tt.input)
if result != tt.expected { if result != tt.expected {
t.Errorf("isMod(%q) = %v, want %v", tt.input, result, tt.expected) t.Errorf("swayIsMod(%q) = %v, want %v", tt.input, result, tt.expected)
} }
}) })
} }

View File

@@ -4,8 +4,6 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"testing" "testing"
"github.com/AvengeMedia/DankMaterialShell/core/internal/sway"
) )
func TestSwayProviderName(t *testing.T) { func TestSwayProviderName(t *testing.T) {
@@ -76,12 +74,12 @@ func TestSwayCategorizeByCommand(t *testing.T) {
func TestSwayFormatKey(t *testing.T) { func TestSwayFormatKey(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
keybind *sway.KeyBinding keybind *SwayKeyBinding
expected string expected string
}{ }{
{ {
name: "single_mod", name: "single_mod",
keybind: &sway.KeyBinding{ keybind: &SwayKeyBinding{
Mods: []string{"Mod4"}, Mods: []string{"Mod4"},
Key: "q", Key: "q",
}, },
@@ -89,7 +87,7 @@ func TestSwayFormatKey(t *testing.T) {
}, },
{ {
name: "multiple_mods", name: "multiple_mods",
keybind: &sway.KeyBinding{ keybind: &SwayKeyBinding{
Mods: []string{"Mod4", "Shift"}, Mods: []string{"Mod4", "Shift"},
Key: "e", Key: "e",
}, },
@@ -97,7 +95,7 @@ func TestSwayFormatKey(t *testing.T) {
}, },
{ {
name: "no_mods", name: "no_mods",
keybind: &sway.KeyBinding{ keybind: &SwayKeyBinding{
Mods: []string{}, Mods: []string{},
Key: "Print", Key: "Print",
}, },
@@ -119,13 +117,13 @@ func TestSwayFormatKey(t *testing.T) {
func TestSwayConvertKeybind(t *testing.T) { func TestSwayConvertKeybind(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
keybind *sway.KeyBinding keybind *SwayKeyBinding
wantKey string wantKey string
wantDesc string wantDesc string
}{ }{
{ {
name: "with_comment", name: "with_comment",
keybind: &sway.KeyBinding{ keybind: &SwayKeyBinding{
Mods: []string{"Mod4"}, Mods: []string{"Mod4"},
Key: "t", Key: "t",
Command: "exec kitty", Command: "exec kitty",
@@ -136,7 +134,7 @@ func TestSwayConvertKeybind(t *testing.T) {
}, },
{ {
name: "without_comment", name: "without_comment",
keybind: &sway.KeyBinding{ keybind: &SwayKeyBinding{
Mods: []string{"Mod4"}, Mods: []string{"Mod4"},
Key: "r", Key: "r",
Command: "reload", Command: "reload",

View File

@@ -1,4 +1,4 @@
package logger package log
import ( import (
"bufio" "bufio"

View File

@@ -2,7 +2,7 @@
## Overview ## Overview
The network manager API provides methods for managing WiFi connections, monitoring network state, and handling credential prompts through NetworkManager. Communication occurs over a message-based protocol (websocket, IPC, etc.) with event subscriptions for state updates. The network manager API provides methods for managing WiFi connections, monitoring network state, and handling credential prompts through NetworkManager or iwd (and systemd-networkd for ethernet only). Communication occurs over a message-based protocol (websocket, IPC, etc.) with event subscriptions for state updates.
## API Methods ## API Methods

View File

@@ -3,14 +3,15 @@ package network
import ( import (
"testing" "testing"
mock_gonetworkmanager "github.com/AvengeMedia/DankMaterialShell/core/internal/mocks/github.com/Wifx/gonetworkmanager/v2"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func TestNetworkManagerBackend_GetWiredConnections_NoDevice(t *testing.T) { func TestNetworkManagerBackend_GetWiredConnections_NoDevice(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.ethernetDevice = nil backend.ethernetDevice = nil
_, err = backend.GetWiredConnections() _, err = backend.GetWiredConnections()
@@ -19,10 +20,10 @@ func TestNetworkManagerBackend_GetWiredConnections_NoDevice(t *testing.T) {
} }
func TestNetworkManagerBackend_GetWiredNetworkDetails_NoDevice(t *testing.T) { func TestNetworkManagerBackend_GetWiredNetworkDetails_NoDevice(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.ethernetDevice = nil backend.ethernetDevice = nil
_, err = backend.GetWiredNetworkDetails("test-uuid") _, err = backend.GetWiredNetworkDetails("test-uuid")
@@ -31,10 +32,10 @@ func TestNetworkManagerBackend_GetWiredNetworkDetails_NoDevice(t *testing.T) {
} }
func TestNetworkManagerBackend_ConnectEthernet_NoDevice(t *testing.T) { func TestNetworkManagerBackend_ConnectEthernet_NoDevice(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.ethernetDevice = nil backend.ethernetDevice = nil
err = backend.ConnectEthernet() err = backend.ConnectEthernet()
@@ -43,10 +44,10 @@ func TestNetworkManagerBackend_ConnectEthernet_NoDevice(t *testing.T) {
} }
func TestNetworkManagerBackend_DisconnectEthernet_NoDevice(t *testing.T) { func TestNetworkManagerBackend_DisconnectEthernet_NoDevice(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.ethernetDevice = nil backend.ethernetDevice = nil
err = backend.DisconnectEthernet() err = backend.DisconnectEthernet()
@@ -55,10 +56,10 @@ func TestNetworkManagerBackend_DisconnectEthernet_NoDevice(t *testing.T) {
} }
func TestNetworkManagerBackend_ActivateWiredConnection_NoDevice(t *testing.T) { func TestNetworkManagerBackend_ActivateWiredConnection_NoDevice(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.ethernetDevice = nil backend.ethernetDevice = nil
err = backend.ActivateWiredConnection("test-uuid") err = backend.ActivateWiredConnection("test-uuid")
@@ -67,25 +68,14 @@ func TestNetworkManagerBackend_ActivateWiredConnection_NoDevice(t *testing.T) {
} }
func TestNetworkManagerBackend_ActivateWiredConnection_NotFound(t *testing.T) { func TestNetworkManagerBackend_ActivateWiredConnection_NotFound(t *testing.T) {
backend, err := NewNetworkManagerBackend() t.Skip("ActivateWiredConnection creates a new Settings instance internally, cannot be fully mocked")
if err != nil {
t.Skipf("NetworkManager not available: %v", err)
}
if backend.ethernetDevice == nil {
t.Skip("No ethernet device available")
}
err = backend.ActivateWiredConnection("non-existent-uuid-12345")
assert.Error(t, err)
assert.Contains(t, err.Error(), "not found")
} }
func TestNetworkManagerBackend_ListEthernetConnections_NoDevice(t *testing.T) { func TestNetworkManagerBackend_ListEthernetConnections_NoDevice(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.ethernetDevice = nil backend.ethernetDevice = nil
_, err = backend.listEthernetConnections() _, err = backend.listEthernetConnections()

View File

@@ -3,15 +3,17 @@ package network
import ( import (
"testing" "testing"
mock_gonetworkmanager "github.com/AvengeMedia/DankMaterialShell/core/internal/mocks/github.com/Wifx/gonetworkmanager/v2"
"github.com/Wifx/gonetworkmanager/v2"
"github.com/godbus/dbus/v5" "github.com/godbus/dbus/v5"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func TestNetworkManagerBackend_HandleDBusSignal_NewConnection(t *testing.T) { func TestNetworkManagerBackend_HandleDBusSignal_NewConnection(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
sig := &dbus.Signal{ sig := &dbus.Signal{
Name: "org.freedesktop.NetworkManager.Settings.NewConnection", Name: "org.freedesktop.NetworkManager.Settings.NewConnection",
@@ -24,10 +26,10 @@ func TestNetworkManagerBackend_HandleDBusSignal_NewConnection(t *testing.T) {
} }
func TestNetworkManagerBackend_HandleDBusSignal_ConnectionRemoved(t *testing.T) { func TestNetworkManagerBackend_HandleDBusSignal_ConnectionRemoved(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
sig := &dbus.Signal{ sig := &dbus.Signal{
Name: "org.freedesktop.NetworkManager.Settings.ConnectionRemoved", Name: "org.freedesktop.NetworkManager.Settings.ConnectionRemoved",
@@ -40,10 +42,10 @@ func TestNetworkManagerBackend_HandleDBusSignal_ConnectionRemoved(t *testing.T)
} }
func TestNetworkManagerBackend_HandleDBusSignal_InvalidBody(t *testing.T) { func TestNetworkManagerBackend_HandleDBusSignal_InvalidBody(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
sig := &dbus.Signal{ sig := &dbus.Signal{
Name: "org.freedesktop.DBus.Properties.PropertiesChanged", Name: "org.freedesktop.DBus.Properties.PropertiesChanged",
@@ -56,10 +58,10 @@ func TestNetworkManagerBackend_HandleDBusSignal_InvalidBody(t *testing.T) {
} }
func TestNetworkManagerBackend_HandleDBusSignal_InvalidInterface(t *testing.T) { func TestNetworkManagerBackend_HandleDBusSignal_InvalidInterface(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
sig := &dbus.Signal{ sig := &dbus.Signal{
Name: "org.freedesktop.DBus.Properties.PropertiesChanged", Name: "org.freedesktop.DBus.Properties.PropertiesChanged",
@@ -72,10 +74,10 @@ func TestNetworkManagerBackend_HandleDBusSignal_InvalidInterface(t *testing.T) {
} }
func TestNetworkManagerBackend_HandleDBusSignal_InvalidChanges(t *testing.T) { func TestNetworkManagerBackend_HandleDBusSignal_InvalidChanges(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
sig := &dbus.Signal{ sig := &dbus.Signal{
Name: "org.freedesktop.DBus.Properties.PropertiesChanged", Name: "org.freedesktop.DBus.Properties.PropertiesChanged",
@@ -88,10 +90,13 @@ func TestNetworkManagerBackend_HandleDBusSignal_InvalidChanges(t *testing.T) {
} }
func TestNetworkManagerBackend_HandleNetworkManagerChange(t *testing.T) { func TestNetworkManagerBackend_HandleNetworkManagerChange(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
mockNM.EXPECT().GetPropertyActiveConnections().Return([]gonetworkmanager.ActiveConnection{}, nil).Maybe()
mockNM.EXPECT().GetPropertyPrimaryConnection().Return(nil, nil).Maybe()
changes := map[string]dbus.Variant{ changes := map[string]dbus.Variant{
"PrimaryConnection": dbus.MakeVariant("/"), "PrimaryConnection": dbus.MakeVariant("/"),
@@ -104,10 +109,14 @@ func TestNetworkManagerBackend_HandleNetworkManagerChange(t *testing.T) {
} }
func TestNetworkManagerBackend_HandleNetworkManagerChange_WirelessEnabled(t *testing.T) { func TestNetworkManagerBackend_HandleNetworkManagerChange_WirelessEnabled(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
mockNM.EXPECT().GetPropertyWirelessEnabled().Return(true, nil)
mockNM.EXPECT().GetPropertyActiveConnections().Return([]gonetworkmanager.ActiveConnection{}, nil).Maybe()
mockNM.EXPECT().GetPropertyPrimaryConnection().Return(nil, nil).Maybe()
changes := map[string]dbus.Variant{ changes := map[string]dbus.Variant{
"WirelessEnabled": dbus.MakeVariant(true), "WirelessEnabled": dbus.MakeVariant(true),
@@ -119,10 +128,13 @@ func TestNetworkManagerBackend_HandleNetworkManagerChange_WirelessEnabled(t *tes
} }
func TestNetworkManagerBackend_HandleNetworkManagerChange_ActiveConnections(t *testing.T) { func TestNetworkManagerBackend_HandleNetworkManagerChange_ActiveConnections(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
mockNM.EXPECT().GetPropertyActiveConnections().Return([]gonetworkmanager.ActiveConnection{}, nil)
mockNM.EXPECT().GetPropertyPrimaryConnection().Return(nil, nil).Maybe()
changes := map[string]dbus.Variant{ changes := map[string]dbus.Variant{
"ActiveConnections": dbus.MakeVariant([]interface{}{}), "ActiveConnections": dbus.MakeVariant([]interface{}{}),
@@ -134,10 +146,13 @@ func TestNetworkManagerBackend_HandleNetworkManagerChange_ActiveConnections(t *t
} }
func TestNetworkManagerBackend_HandleDeviceChange(t *testing.T) { func TestNetworkManagerBackend_HandleDeviceChange(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
mockNM.EXPECT().GetPropertyActiveConnections().Return([]gonetworkmanager.ActiveConnection{}, nil).Maybe()
mockNM.EXPECT().GetPropertyPrimaryConnection().Return(nil, nil).Maybe()
changes := map[string]dbus.Variant{ changes := map[string]dbus.Variant{
"State": dbus.MakeVariant(uint32(100)), "State": dbus.MakeVariant(uint32(100)),
@@ -149,10 +164,10 @@ func TestNetworkManagerBackend_HandleDeviceChange(t *testing.T) {
} }
func TestNetworkManagerBackend_HandleDeviceChange_Ip4Config(t *testing.T) { func TestNetworkManagerBackend_HandleDeviceChange_Ip4Config(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
changes := map[string]dbus.Variant{ changes := map[string]dbus.Variant{
"Ip4Config": dbus.MakeVariant("/"), "Ip4Config": dbus.MakeVariant("/"),
@@ -164,10 +179,10 @@ func TestNetworkManagerBackend_HandleDeviceChange_Ip4Config(t *testing.T) {
} }
func TestNetworkManagerBackend_HandleWiFiChange_ActiveAccessPoint(t *testing.T) { func TestNetworkManagerBackend_HandleWiFiChange_ActiveAccessPoint(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
changes := map[string]dbus.Variant{ changes := map[string]dbus.Variant{
"ActiveAccessPoint": dbus.MakeVariant("/"), "ActiveAccessPoint": dbus.MakeVariant("/"),
@@ -179,10 +194,10 @@ func TestNetworkManagerBackend_HandleWiFiChange_ActiveAccessPoint(t *testing.T)
} }
func TestNetworkManagerBackend_HandleWiFiChange_AccessPoints(t *testing.T) { func TestNetworkManagerBackend_HandleWiFiChange_AccessPoints(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
changes := map[string]dbus.Variant{ changes := map[string]dbus.Variant{
"AccessPoints": dbus.MakeVariant([]interface{}{}), "AccessPoints": dbus.MakeVariant([]interface{}{}),
@@ -194,10 +209,10 @@ func TestNetworkManagerBackend_HandleWiFiChange_AccessPoints(t *testing.T) {
} }
func TestNetworkManagerBackend_HandleAccessPointChange_NoStrength(t *testing.T) { func TestNetworkManagerBackend_HandleAccessPointChange_NoStrength(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
changes := map[string]dbus.Variant{ changes := map[string]dbus.Variant{
"SomeOtherProperty": dbus.MakeVariant("value"), "SomeOtherProperty": dbus.MakeVariant("value"),
@@ -209,10 +224,10 @@ func TestNetworkManagerBackend_HandleAccessPointChange_NoStrength(t *testing.T)
} }
func TestNetworkManagerBackend_HandleAccessPointChange_WithStrength(t *testing.T) { func TestNetworkManagerBackend_HandleAccessPointChange_WithStrength(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.stateMutex.Lock() backend.stateMutex.Lock()
backend.state.WiFiSignal = 50 backend.state.WiFiSignal = 50
@@ -228,10 +243,10 @@ func TestNetworkManagerBackend_HandleAccessPointChange_WithStrength(t *testing.T
} }
func TestNetworkManagerBackend_StopSignalPump_NoConnection(t *testing.T) { func TestNetworkManagerBackend_StopSignalPump_NoConnection(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.dbusConn = nil backend.dbusConn = nil
assert.NotPanics(t, func() { assert.NotPanics(t, func() {

View File

@@ -3,15 +3,15 @@ package network
import ( import (
"testing" "testing"
mock_gonetworkmanager "github.com/AvengeMedia/DankMaterialShell/core/internal/mocks/github.com/Wifx/gonetworkmanager/v2"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func TestNetworkManagerBackend_New(t *testing.T) { func TestNetworkManagerBackend_New(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err)
}
backend, err := NewNetworkManagerBackend(mockNM)
assert.NoError(t, err)
assert.NotNil(t, backend) assert.NotNil(t, backend)
assert.Equal(t, "networkmanager", backend.state.Backend) assert.Equal(t, "networkmanager", backend.state.Backend)
assert.NotNil(t, backend.stopChan) assert.NotNil(t, backend.stopChan)
@@ -19,10 +19,10 @@ func TestNetworkManagerBackend_New(t *testing.T) {
} }
func TestNetworkManagerBackend_GetCurrentState(t *testing.T) { func TestNetworkManagerBackend_GetCurrentState(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.state.NetworkStatus = StatusWiFi backend.state.NetworkStatus = StatusWiFi
backend.state.WiFiConnected = true backend.state.WiFiConnected = true
@@ -49,10 +49,10 @@ func TestNetworkManagerBackend_GetCurrentState(t *testing.T) {
} }
func TestNetworkManagerBackend_SetPromptBroker_Nil(t *testing.T) { func TestNetworkManagerBackend_SetPromptBroker_Nil(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
err = backend.SetPromptBroker(nil) err = backend.SetPromptBroker(nil)
assert.Error(t, err) assert.Error(t, err)
@@ -60,10 +60,10 @@ func TestNetworkManagerBackend_SetPromptBroker_Nil(t *testing.T) {
} }
func TestNetworkManagerBackend_SubmitCredentials_NoBroker(t *testing.T) { func TestNetworkManagerBackend_SubmitCredentials_NoBroker(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.promptBroker = nil backend.promptBroker = nil
err = backend.SubmitCredentials("token", map[string]string{"password": "test"}, false) err = backend.SubmitCredentials("token", map[string]string{"password": "test"}, false)
@@ -72,10 +72,10 @@ func TestNetworkManagerBackend_SubmitCredentials_NoBroker(t *testing.T) {
} }
func TestNetworkManagerBackend_CancelCredentials_NoBroker(t *testing.T) { func TestNetworkManagerBackend_CancelCredentials_NoBroker(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.promptBroker = nil backend.promptBroker = nil
err = backend.CancelCredentials("token") err = backend.CancelCredentials("token")
@@ -84,10 +84,10 @@ func TestNetworkManagerBackend_CancelCredentials_NoBroker(t *testing.T) {
} }
func TestNetworkManagerBackend_EnsureWiFiDevice_NoDevice(t *testing.T) { func TestNetworkManagerBackend_EnsureWiFiDevice_NoDevice(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.wifiDevice = nil backend.wifiDevice = nil
backend.wifiDev = nil backend.wifiDev = nil
@@ -98,10 +98,10 @@ func TestNetworkManagerBackend_EnsureWiFiDevice_NoDevice(t *testing.T) {
} }
func TestNetworkManagerBackend_EnsureWiFiDevice_AlreadySet(t *testing.T) { func TestNetworkManagerBackend_EnsureWiFiDevice_AlreadySet(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.wifiDev = "dummy-device" backend.wifiDev = "dummy-device"
@@ -110,10 +110,10 @@ func TestNetworkManagerBackend_EnsureWiFiDevice_AlreadySet(t *testing.T) {
} }
func TestNetworkManagerBackend_StartSecretAgent_NoBroker(t *testing.T) { func TestNetworkManagerBackend_StartSecretAgent_NoBroker(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.promptBroker = nil backend.promptBroker = nil
err = backend.startSecretAgent() err = backend.startSecretAgent()
@@ -122,10 +122,10 @@ func TestNetworkManagerBackend_StartSecretAgent_NoBroker(t *testing.T) {
} }
func TestNetworkManagerBackend_Close(t *testing.T) { func TestNetworkManagerBackend_Close(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
assert.NotPanics(t, func() { assert.NotPanics(t, func() {
backend.Close() backend.Close()
@@ -133,20 +133,20 @@ func TestNetworkManagerBackend_Close(t *testing.T) {
} }
func TestNetworkManagerBackend_GetPromptBroker(t *testing.T) { func TestNetworkManagerBackend_GetPromptBroker(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
broker := backend.GetPromptBroker() broker := backend.GetPromptBroker()
assert.Nil(t, broker) assert.Nil(t, broker)
} }
func TestNetworkManagerBackend_StopMonitoring_NoSignals(t *testing.T) { func TestNetworkManagerBackend_StopMonitoring_NoSignals(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
assert.NotPanics(t, func() { assert.NotPanics(t, func() {
backend.StopMonitoring() backend.StopMonitoring()

View File

@@ -21,33 +21,26 @@ func TestNetworkManagerBackend_GetWiFiEnabled(t *testing.T) {
} }
func TestNetworkManagerBackend_SetWiFiEnabled(t *testing.T) { func TestNetworkManagerBackend_SetWiFiEnabled(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err)
}
originalState, err := backend.GetWiFiEnabled() backend, err := NewNetworkManagerBackend(mockNM)
if err != nil { assert.NoError(t, err)
t.Skipf("Cannot get WiFi state: %v", err)
}
defer func() { mockNM.EXPECT().SetPropertyWirelessEnabled(true).Return(nil)
backend.SetWiFiEnabled(originalState)
}()
err = backend.SetWiFiEnabled(!originalState) err = backend.SetWiFiEnabled(true)
assert.NoError(t, err) assert.NoError(t, err)
backend.stateMutex.RLock() backend.stateMutex.RLock()
assert.Equal(t, !originalState, backend.state.WiFiEnabled) assert.True(t, backend.state.WiFiEnabled)
backend.stateMutex.RUnlock() backend.stateMutex.RUnlock()
} }
func TestNetworkManagerBackend_ScanWiFi_NoDevice(t *testing.T) { func TestNetworkManagerBackend_ScanWiFi_NoDevice(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.wifiDevice = nil backend.wifiDevice = nil
err = backend.ScanWiFi() err = backend.ScanWiFi()
@@ -56,14 +49,14 @@ func TestNetworkManagerBackend_ScanWiFi_NoDevice(t *testing.T) {
} }
func TestNetworkManagerBackend_ScanWiFi_Disabled(t *testing.T) { func TestNetworkManagerBackend_ScanWiFi_Disabled(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil { mockDeviceWireless := mock_gonetworkmanager.NewMockDeviceWireless(t)
t.Skipf("NetworkManager not available: %v", err)
}
if backend.wifiDevice == nil { backend, err := NewNetworkManagerBackend(mockNM)
t.Skip("No WiFi device available") assert.NoError(t, err)
}
backend.wifiDevice = mockDeviceWireless
backend.wifiDev = mockDeviceWireless
backend.stateMutex.Lock() backend.stateMutex.Lock()
backend.state.WiFiEnabled = false backend.state.WiFiEnabled = false
@@ -75,10 +68,10 @@ func TestNetworkManagerBackend_ScanWiFi_Disabled(t *testing.T) {
} }
func TestNetworkManagerBackend_GetWiFiNetworkDetails_NoDevice(t *testing.T) { func TestNetworkManagerBackend_GetWiFiNetworkDetails_NoDevice(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.wifiDevice = nil backend.wifiDevice = nil
_, err = backend.GetWiFiNetworkDetails("TestNetwork") _, err = backend.GetWiFiNetworkDetails("TestNetwork")
@@ -87,10 +80,10 @@ func TestNetworkManagerBackend_GetWiFiNetworkDetails_NoDevice(t *testing.T) {
} }
func TestNetworkManagerBackend_ConnectWiFi_NoDevice(t *testing.T) { func TestNetworkManagerBackend_ConnectWiFi_NoDevice(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.wifiDevice = nil backend.wifiDevice = nil
req := ConnectionRequest{SSID: "TestNetwork", Password: "password"} req := ConnectionRequest{SSID: "TestNetwork", Password: "password"}
@@ -100,14 +93,14 @@ func TestNetworkManagerBackend_ConnectWiFi_NoDevice(t *testing.T) {
} }
func TestNetworkManagerBackend_ConnectWiFi_AlreadyConnected(t *testing.T) { func TestNetworkManagerBackend_ConnectWiFi_AlreadyConnected(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil { mockDeviceWireless := mock_gonetworkmanager.NewMockDeviceWireless(t)
t.Skipf("NetworkManager not available: %v", err)
}
if backend.wifiDevice == nil { backend, err := NewNetworkManagerBackend(mockNM)
t.Skip("No WiFi device available") assert.NoError(t, err)
}
backend.wifiDevice = mockDeviceWireless
backend.wifiDev = mockDeviceWireless
backend.stateMutex.Lock() backend.stateMutex.Lock()
backend.state.WiFiConnected = true backend.state.WiFiConnected = true
@@ -120,10 +113,10 @@ func TestNetworkManagerBackend_ConnectWiFi_AlreadyConnected(t *testing.T) {
} }
func TestNetworkManagerBackend_DisconnectWiFi_NoDevice(t *testing.T) { func TestNetworkManagerBackend_DisconnectWiFi_NoDevice(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.wifiDevice = nil backend.wifiDevice = nil
err = backend.DisconnectWiFi() err = backend.DisconnectWiFi()
@@ -132,10 +125,10 @@ func TestNetworkManagerBackend_DisconnectWiFi_NoDevice(t *testing.T) {
} }
func TestNetworkManagerBackend_IsConnectingTo(t *testing.T) { func TestNetworkManagerBackend_IsConnectingTo(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.stateMutex.Lock() backend.stateMutex.Lock()
backend.state.IsConnecting = true backend.state.IsConnecting = true
@@ -147,10 +140,10 @@ func TestNetworkManagerBackend_IsConnectingTo(t *testing.T) {
} }
func TestNetworkManagerBackend_IsConnectingTo_NotConnecting(t *testing.T) { func TestNetworkManagerBackend_IsConnectingTo_NotConnecting(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.stateMutex.Lock() backend.stateMutex.Lock()
backend.state.IsConnecting = false backend.state.IsConnecting = false
@@ -161,10 +154,10 @@ func TestNetworkManagerBackend_IsConnectingTo_NotConnecting(t *testing.T) {
} }
func TestNetworkManagerBackend_UpdateWiFiNetworks_NoDevice(t *testing.T) { func TestNetworkManagerBackend_UpdateWiFiNetworks_NoDevice(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.wifiDevice = nil backend.wifiDevice = nil
_, err = backend.updateWiFiNetworks() _, err = backend.updateWiFiNetworks()
@@ -173,10 +166,10 @@ func TestNetworkManagerBackend_UpdateWiFiNetworks_NoDevice(t *testing.T) {
} }
func TestNetworkManagerBackend_FindConnection_NoSettings(t *testing.T) { func TestNetworkManagerBackend_FindConnection_NoSettings(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.settings = nil backend.settings = nil
_, err = backend.findConnection("NonExistentNetwork") _, err = backend.findConnection("NonExistentNetwork")
@@ -184,10 +177,10 @@ func TestNetworkManagerBackend_FindConnection_NoSettings(t *testing.T) {
} }
func TestNetworkManagerBackend_CreateAndConnectWiFi_NoDevice(t *testing.T) { func TestNetworkManagerBackend_CreateAndConnectWiFi_NoDevice(t *testing.T) {
backend, err := NewNetworkManagerBackend() mockNM := mock_gonetworkmanager.NewMockNetworkManager(t)
if err != nil {
t.Skipf("NetworkManager not available: %v", err) backend, err := NewNetworkManagerBackend(mockNM)
} assert.NoError(t, err)
backend.wifiDevice = nil backend.wifiDevice = nil
backend.wifiDev = nil backend.wifiDev = nil