Хламидомонада / Говнокод #24452 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
instance Arbitrary ProjectConfig where
    arbitrary =
      ProjectConfig
        <$> (map getPackageLocationString <$> arbitrary)
        <*> (map getPackageLocationString <$> arbitrary)
        <*> shortListOf 3 arbitrary
        <*> arbitrary
        <*> arbitrary
        <*> arbitrary
        <*> arbitrary
        <*> arbitrary
        <*> arbitrary
        <*> (MapMappend . fmap getNonMEmpty . Map.fromList
               <$> shortListOf 3 arbitrary)
        -- package entries with no content are equivalent to
        -- the entry not existing at all, so exclude empty

    shrink ProjectConfig { projectPackages = x0
                         , projectPackagesOptional = x1
                         , projectPackagesRepo = x2
                         , projectPackagesNamed = x3
                         , projectConfigBuildOnly = x4
                         , projectConfigShared = x5
                         , projectConfigProvenance = x6
                         , projectConfigLocalPackages = x7
                         , projectConfigSpecificPackage = x8
                         , projectConfigAllPackages = x9 } =
      [ ProjectConfig { projectPackages = x0'
                      , projectPackagesOptional = x1'
                      , projectPackagesRepo = x2'
                      , projectPackagesNamed = x3'
                      , projectConfigBuildOnly = x4'
                      , projectConfigShared = x5'
                      , projectConfigProvenance = x6'
                      , projectConfigLocalPackages = x7'
                      , projectConfigSpecificPackage = (MapMappend
                                                         (fmap getNonMEmpty x8'))
                      , projectConfigAllPackages = x9' }
      | ((x0', x1', x2', x3'), (x4', x5', x6', x7', x8', x9'))
          <- shrink ((x0, x1, x2, x3),
                      (x4, x5, x6, x7, fmap NonMEmpty (getMapMappend x8), x9))
      ]

В хачкеле мало бойлерплейта, говорили они. Это ещё далеко не самый длинный список, см. x43 ниже.

https://github.com/haskell/cabal/blob/4e0c701a2feb520d369ef506a18288c47f64b06a/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs

Запостил: roman-kashitsyn roman-kashitsyn, (Updated )

Комментарии (20) RSS

  • Ехал <*> arbitrary через <*> arbitrary,
    Видит <*> arbitrary — в <*> arbitrary <*> arbitrary,
    Сунул <*> arbitrary <*> arbitrary в <*> arbitrary,
    <*> arbitrary за <*> arbitrary <*> arbitrary <*> arbitrary.
    Ответить
  • То ли дело "Erlang":
    subscriber_config_gen() ->
      ?LET({MinBytes, MaxBytes}, {range(0, 1 bsl 9), range(0, 1 bsl 9)},
           [ {min_bytes, MinBytes}
           , {max_bytes, MinBytes + MaxBytes}
           , {max_wait_time, range(0, ?MESSAGE_DEADLINE div 2)}
           , {sleep_timeout, range(0, ?MESSAGE_DEADLINE div 2)}
           , {prefetch_count, range(0, ?MAX_MESSAGES*8)}
           , {prefetch_bytes, range(0, 1 bsl 16)}
           , {size_stat_window, 5}
           ]).

    Сила динамического питуха!
    Ответить
        • он умеет сохранять инварианты во время schrink? (min_bytes ≤ max_bytes), например?
          Ответить
            • P.S. Поэтому он бывает долго не может найти условия, где все прекондишны выполняются, поэтому имеет смысл делать генераторы такими, чтобы в них не было инвариантов.

              Моё любимое детище so far:
              https://github.com/k32/task_graph/blob/master/test/task_graph_SUITE.erl#L182
              Ациклические графы без единого гвоздя^W прекондишна.
              Ответить
                • Что же ещё. Только это будет не Shake, а rebar3, сделанный правильно. К сожалению, делать эту питушню надо именно на Эрланге, ибо эксперименты показали, что вызов erlc очень дорогой, поэтому всю компиляцию надо батчить в один запуск BEAM.
                  Ответить
                  • А нельзя сделать сервер компиляции, который работает в бэкграунде и принимает задачи от cmd-тулы? Тогда билд-систему можно на чём угодно писать.
                    Ответить
                    • Собственно в K. мы и билдим как ты сказал. Но хочется использовать что-то типа rebar3, ибо он очень продуман в смысле семантики. К сожалению, с точки зрения алгоритмов имплементация там крайне неудачная.
                      Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8